在Windows中执行全屏截图

4
我正在研究一个涉及全屏捕获包括窗口和应用程序的想法,对其进行分析,然后将项目作为覆盖层绘制回到屏幕上。
如果可以直接访问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访问它。
性能还算令人满意。在1920x1200x32下,BitBlt的执行时间为50毫秒(有时低至33ms)。
令我惊讶的是,当我将显示模式切换到16位,即1920x1200x16时,不管是通过我的图形设置事先进行,还是通过使用ChangeDisplaySettings,我得到了一个极大的改进,屏幕截取时间在1ms和2ms之间,这不能仅仅由于比特深度减少一半来解释。在16位模式下,使用CreateDIBSection(如上所述)与使用CreateCompatibleBitmap相比,速度提高显著(6-7ms/f)。
有人知道为什么降到16位会导致如此快的速度增加吗?是否有希望以这样的速度获取32位?如果不是因为颜色深度,而是为了不强制更改屏幕缓冲区模式和可怕的闪烁。
1个回答

2

我解决了关于切换到16位彩色模式速度惊人地加快的问题。原来这导致Aero主题被禁用,这占了大部分原因。在32位中关闭Aero后,速度几乎一样快。

链接到另一个有好答案的话题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接