gpt4 book ai didi

c++ - 在 Windows 中执行全屏抓取

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:38 25 4
gpt4 key购买 nike

我正在研究一个想法,涉及获取包括窗口和应用程序在内的屏幕的完整捕获,对其进行分析,然后将项目作为叠加层绘制回屏幕上。

我想学习图像处理技术,如果我可以直接访问 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 在 1920x1200x32 下的执行时间为 50 毫秒(有时低至 33 毫秒)。

令我惊讶的是,当我将显示模式切换到 16 位 1920x1200x16 时,无论是通过我事先的图形设置,还是通过使用 ChangeDisplaySettings,我都得到了 1ms 到 2ms 之间的大幅改进的屏幕抓取时间,这不能用位深度减少两倍的因素来解释。与使用 CreateCompatibleBitmap (6-7ms/f) 设置相比,在 16 位模式下使用 CreateDIBSection(如上所述)可显着加快速度。

有谁知道为什么降到 16 位会导致这样的速度提升?这样的速度我还有希望抢到32bit吗?如果不是为了颜色深度,而是为了不强制更改屏幕缓冲模式和可怕的闪烁。

最佳答案

我解决了我原来的问题,即切换到 16 位颜色模式的速度令人难以置信。原来它导致 Aero 主题被禁用,这是其中的大部分原因。在 32 位中关闭 Aero,它的速度差不多。

Link其他主题有一个很好的答案。

关于c++ - 在 Windows 中执行全屏抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2831978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com