То есть делаю слепок с какого то определенного экрана. Но нужно делать со всех, тогда вот начал делать метод, который снимает со всех экранов и склеивает полученные Bitmap'ы в один большой Bitmap. И тут же столкнулся с проблемой: В классе Screen я не нашел в каком порядке расположены экраны. То есть смысл в том чтобы склеить все Bitmap'ы так как они есть на экранах, в тех же положениях.
То есть если экраны расположены так:
Здравствуйте, samius, Вы писали:
S>Здравствуйте, head-dron, Вы писали:
HD>>В какую сторону в этом случае смотреть?
S>В сторону сортировки
Хорошо. А что если помимо главного экрана есть один сверху и один справа. Как узнать что тот что сверху, именно сверху? Об этом информации в Screen нету. Да и не узнать никак.
Re: C# Скриншот экрана
От:
Аноним
Дата:
29.10.10 07:20
Оценка:
Здравствуйте, head-dron, Вы писали:
HD>Необходимо сделать скриншот экрана. HD>Когда начал делать, делал через CopyFromScreen. То есть вот такой метод получился.
Здравствуйте, head-dron, Вы писали:
HD>Здравствуйте, samius, Вы писали:
S>>Здравствуйте, head-dron, Вы писали:
HD>>>В какую сторону в этом случае смотреть?
S>>В сторону сортировки
HD>Хорошо. А что если помимо главного экрана есть один сверху и один справа. Как узнать что тот что сверху, именно сверху? Об этом информации в Screen нету. Да и не узнать никак.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, head-dron, Вы писали:
HD>>Здравствуйте, samius, Вы писали:
S>>>Здравствуйте, head-dron, Вы писали:
HD>>>>В какую сторону в этом случае смотреть?
S>>>В сторону сортировки
HD>>Хорошо. А что если помимо главного экрана есть один сверху и один справа. Как узнать что тот что сверху, именно сверху? Об этом информации в Screen нету. Да и не узнать никак.
S>А что на счет screen.Bounds?
Не увидел там нужной информации. Разве что может ли являться "screen.Bounds.Location" координаты именно относительно всех экранов?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, head-dron, Вы писали:
HD>>Необходимо сделать скриншот экрана. HD>>Когда начал делать, делал через CopyFromScreen. То есть вот такой метод получился.
А>Контроль за действиями сотрудников?
Нет. )) Личные цели
Здравствуйте, head-dron, Вы писали:
HD>Здравствуйте, samius, Вы писали:
S>>Здравствуйте, head-dron, Вы писали:
HD>>>Хорошо. А что если помимо главного экрана есть один сверху и один справа. Как узнать что тот что сверху, именно сверху? Об этом информации в Screen нету. Да и не узнать никак.
S>>А что на счет screen.Bounds?
HD>Не увидел там нужной информации. Разве что может ли являться "screen.Bounds.Location" координаты именно относительно всех экранов?
Здравствуйте, head-dron, Вы писали:
HD>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, head-dron, Вы писали:
HD>>>Необходимо сделать скриншот экрана. HD>>>Когда начал делать, делал через CopyFromScreen. То есть вот такой метод получился.
А>>Контроль за действиями сотрудников? HD>Нет. )) Личные цели
Здравствуйте, samius, Вы писали:
S>Здравствуйте, head-dron, Вы писали:
HD>>То есть screen.Bounds.X это координата относительно всех экранов?
S>Затрудняюсь ответить, непонимаю что значит "относительно всех экранов".
Дак вот. Допустим позиция центрального в массиве x=1, y=1. Хранится ли то же самое в screen.Bounds.X и screen.Bounds.Y соответственно? Или же там всегда хранится начальная координата относительно выбранного Screen'а (то есть 0, 0)?
Здравствуйте, head-dron, Вы писали:
HD>Здравствуйте, samius, Вы писали:
S>>Здравствуйте, head-dron, Вы писали:
HD>>>То есть screen.Bounds.X это координата относительно всех экранов?
S>>Затрудняюсь ответить, непонимаю что значит "относительно всех экранов".
HD>На примере массива:
HD>1 1 1 HD>1 1 1 HD>1 1 1
HD>9 экранов.
HD>Дак вот. Допустим позиция центрального в массиве x=1, y=1. Хранится ли то же самое в screen.Bounds.X и screen.Bounds.Y соответственно? Или же там всегда хранится начальная координата относительно выбранного Screen'а (то есть 0, 0)?
Там хранятся не координаты скринов в матрице скринов, а прямоугольники скринов в общей системе координат-пикселей. AFAIR начало системы координат — левый верхний угол праймари скрина.
И вообще клеить ничего не надо. Нужно создать большой битмап и в цикле по скринам скопировать в него области соответствующих скринов на соответствующее место. Только нужно учесть, что координаты прямоугольников скринов могут быть отрицательные.
S>Там хранятся не координаты скринов в матрице скринов, а прямоугольники скринов в общей системе координат-пикселей. AFAIR начало системы координат — левый верхний угол праймари скрина.
S>И вообще клеить ничего не надо. Нужно создать большой битмап и в цикле по скринам скопировать в него области соответствующих скринов на соответствующее место. Только нужно учесть, что координаты прямоугольников скринов могут быть отрицательные.
То есть как я понял если у основного скрина координата 0, 0. То у того что слева от него будет уже допустим -1024, 0 ??
А ведь можно же схитрить. Если мне в любом случае нужны все скрины на одном битмапе, то почему бы сразу все и не заснапить?
Допустим вычислить через цикл самую мелкую и самую крупную координату у скринов и потом подставить в CopyFromScreen.
Вот по быстрому набросал:
public void GlobalPoints(out Point first, out Point last)
{
int FX = 0, FY = 0, LX = 0, LY = 0;
int scrFX, scrFY, scrLX, scrLY;
foreach (Screen screen in Screen.AllScreens)
{
scrFX = screen.Bounds.X;
scrFY = screen.Bounds.Y;
scrLX = screen.Bounds.X + screen.Bounds.Width;
scrLY = screen.Bounds.Y + screen.Bounds.Height;
if (FX > scrFX) FX = scrFX;
if (FY > scrFY) FY = scrFY;
if (LX < scrLX) LX = scrLX;
if (LY < scrLY) LY = scrLY;
}
LX += Abs(FX);
LY += Abs(FY);
first = new Point(FX, FY);
last = new Point(LX, LY);
}
И сделать потом
graph.CopyFromScreen(first.X, first.Y, 0, 0, new Size(last), CopyPixelOperation.SourceCopy);
А размер битмапа вот такой сделать
Bitmap bmp = new Bitmap(Abs(first.X) + Abs(last.X), Abs(first.Y) + Abs(last.Y));