C++ 在windows中执行全屏抓取

C++ 在windows中执行全屏抓取,c++,winapi,mingw,screenshot,overlay,C++,Winapi,Mingw,Screenshot,Overlay,我正在研究一个想法,包括获取屏幕的完整捕获,包括窗口和应用程序,对其进行分析,然后将项目重新绘制到屏幕上,作为覆盖 我想学习图像处理技术,如果我可以直接访问Windows屏幕,我可以获得大量的数据。我可以用它来构建以前从未见过的自动化工具。稍后再谈 我有全屏截图工作的大部分 HWND hwind = GetDesktopWindow(); HDC hdc = GetDC(hwind); int resx = GetSystemMetrics(SM_CXSCREEN); int resy = G

我正在研究一个想法,包括获取屏幕的完整捕获,包括窗口和应用程序,对其进行分析,然后将项目重新绘制到屏幕上,作为覆盖

我想学习图像处理技术,如果我可以直接访问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);
清理代码(我不知道这是否正确):

每次调用BitBlt时,它都会抓取屏幕并将其保存在内存中,我可以通过
数据访问它

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

令我惊讶的是,当我通过事先的图形设置或使用
changediplaysettings
将显示模式切换到16位1920x1200x16时,我获得了1ms到2ms之间的屏幕抓取时间的大幅改善,这不能用位深度减少两个因素来解释。与使用
CreateCompatibleBitmap
(6-7ms/f)设置相比,使用
CreateDIBSection
(如上)在16位模式下提供了显著的速度提升


有人知道为什么降到16位会导致这样的速度提高吗?在这样的速度下,我有希望抓取32位吗?如果不是为了颜色深度,而是为了不强制改变屏幕缓冲模式和可怕的闪烁

我解决了我最初的问题,即切换到16位颜色模式的速度惊人。结果是它导致了Aero主题被禁用,而这正是它的主要原因。在32位关闭Aero的情况下,速度也差不多

用一个好的答案回答另一个话题

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