Я работаю над идеей, которая заключается в том, чтобы получить полный снимок экрана, включая окна и приложения, проанализировать его, а затем вывести элементы обратно на экран в виде наложения.
Я хочу изучить методы обработки изображений и получить много данных для работы, если получу прямой доступ к экрану 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 бита на таких скоростях? если не для глубины цвета, но для того, чтобы не заставлять смену режимов экранного буфера и ужасного мерцания.