c – 在窗口中执行全屏抓取

我正在研究一个想法,包括完全捕获屏幕,包括窗口和应用程序,分析它,然后将项目作为叠加层重新绘制到屏幕上.

我想学习图像处理技术,如果我可以直接访问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时,它都会抓取屏幕并将其保存在内存中,我可以访问数据.

性能有点令人满意. BitBlt在1920x1200x32下以50毫秒(有时低至33毫秒)执行.

令我惊讶的是,当我切换显示模式为16位,1920x1200x16,无论是通过我的图形设置事前,或使用ChangeDisplaySettings,我得到1毫秒和2毫秒之间的大规模改进的屏幕抓取时间,这不能由两个因素来解释比特深度减少.与使用CreateCompatibleBitmap(6-7ms / f)设置相比,使用CreateDIBSection(如上所述)在16位模式下提供了显着的加速.

有人知道为什么降到16位导致这样的速度增加?我有希望以这样的速度抓住32位吗?如果不是颜色深度,但不强制更改屏幕缓冲模式和可怕的闪烁.

最佳答案 我解决了关于切换到16位颜色模式的令人难以置信的加速的原始问题.事实证明它导致Aero主题被禁用,这占了大部分主题.随着Aero在32位的关闭,它的速度也快得多.

Link给其他话题带来了很好的答案.

点赞