Выполнение полноэкранного захвата в Windows - PullRequest
4 голосов
/ 14 мая 2010

Я работаю над идеей, которая заключается в том, чтобы получить полный снимок экрана, включая окна и приложения, проанализировать его, а затем вывести элементы обратно на экран в виде наложения.

Я хочу изучить методы обработки изображений и получить много данных для работы, если получу прямой доступ к экрану Windows. Я мог бы использовать это для создания средств автоматизации, подобных которым раньше никогда не было. Подробнее об этом позже.

У меня полноэкранный снимок, работающий по большей части.

HWND hwind = GetDesktopWindow();
HDC hdc = GetDC(hwind);

int resx = GetSystemMetrics(SM_CXSCREEN);
int resy = GetSystemMetrics(SM_CYSCREEN);
int BitsPerPixel = GetDeviceCaps(hdc,BITSPIXEL);
HDC hdc2 = CreateCompatibleDC(hdc);

BITMAPINFO info;
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biWidth = resx;
info.bmiHeader.biHeight = resy;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biBitCount  = BitsPerPixel;
info.bmiHeader.biCompression = BI_RGB;

void *data;
hbitmap = CreateDIBSection(hdc2,&info,DIB_RGB_COLORS,(void**)&data,0,0);
SelectObject(hdc2,hbitmap);

Как только это будет сделано, я могу повторно вызывать это:

BitBlt(hdc2,0,0,resx,resy,hdc,0,0,SRCCOPY);

Код очистки (я понятия не имею, если это правильно):

DeleteObject(hbitmap);
ReleaseDC(hwind,hdc);
if (hdc2) {
    DeleteDC(hdc2);
}

Каждый раз, когда вызывается BitBlt, он захватывает экран и сохраняет его в памяти, к которой я могу получить доступ через data.

Производительность несколько удовлетворительная. BitBlt выполняется за 50 миллисекунд (иногда до 33 мс) с разрешением 1920x1200x32.

Что меня удивляет, так это то, что когда я переключаю режим отображения в 16-битный, 1920x1200x16, либо предварительно установив параметры графики, либо используя ChangeDisplaySettings, я получаю значительно улучшенное время захвата экрана между 1 мс и 2 мс, что не может быть объяснено в два раза уменьшение глубины в битах. Использование CreateDIBSection (как указано выше) обеспечивает значительное увеличение скорости в 16-битном режиме по сравнению с настройкой CreateCompatibleBitmap (6-7 мс / ф).

Кто-нибудь знает, почему падение на 16 бит вызывает такое увеличение скорости? Есть ли у меня надежда захватить 32 бита на таких скоростях? если не для глубины цвета, но для того, чтобы не заставлять смену режимов экранного буфера и ужасного мерцания.

1 Ответ

2 голосов
/ 14 мая 2010

Я решил свой оригинальный вопрос о невероятной скорости перехода в 16-битный цветной режим. Оказывается, это приводило к отключению темы Aero, которая составляет большую часть ее. С отключенным Aero в 32-битном это почти так же быстро.

Ссылка на другую тему с хорошим ответом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...