我正在研究一个涉及全屏捕获包括窗口和应用程序的想法,对其进行分析,然后将项目作为覆盖层绘制回到屏幕上。
如果可以直接访问Windows屏幕,我希望学习图像处理技术并且可以获取大量数据来进行操作。我可以使用它来构建前所未见的自动化工具。稍后会详细介绍。
目前我已经基本实现了全屏捕获。
一旦完成这个步骤,我就可以反复调用它:
清理代码(我不知道这是否正确):
每次调用BitBlt时,它都会抓取屏幕并将其保存在内存中,我可以通过
性能还算令人满意。在1920x1200x32下,BitBlt的执行时间为50毫秒(有时低至33ms)。
令我惊讶的是,当我将显示模式切换到16位,即1920x1200x16时,不管是通过我的图形设置事先进行,还是通过使用
有人知道为什么降到16位会导致如此快的速度增加吗?是否有希望以这样的速度获取32位?如果不是因为颜色深度,而是为了不强制更改屏幕缓冲区模式和可怕的闪烁。
如果可以直接访问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位?如果不是因为颜色深度,而是为了不强制更改屏幕缓冲区模式和可怕的闪烁。