2010-05-14 95 views
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访问。

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

我感到惊讶的是,当我通过事先的图形设置或通过使用ChangeDisplaySettings将显示模式切换到16位,1920x1200x16时,我获得了1ms和2ms之间大幅提高的屏幕截图时间,这不能用比特深度减少两个因素。使用CreateDIBSection(如上所述)在16位模式下提供了显着的加速,相比之下,如果我使用CreateCompatibleBitmap(6-7ms/f)进行设置。

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

回答

2

我解决了我原来关于切换到16位彩色模式的难以置信的加速问题。事实证明,这导致了Aero主题被禁用,其中大部分是占据的。随着32位Aero的关闭速度一样快。

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

+0

是啊为什么航空降到15 fps我不知道... – rogerdpack 2012-04-30 13:01:03