如何使用aero加速BitBlt捕获屏幕?

TX_*_*TX_ 5 gdi screen-capture bitblt visual-c++

我使用以下代码来捕获具有GDI函数的屏幕:

// Prologue:

int iScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int iScreenHeight = GetSystemMetrics(SM_CYSCREEN);

HDC hScreenDC = GetDC(0);
HDC hCaptureDC = CreateCompatibleDC(hScreenDC);
HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hScreenDC, iScreenWidth, iScreenHeight);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hCaptureDC, hCaptureBitmap);

// Capture:

BitBlt(hCaptureDC, 0, 0, iScreenWidth, iScreenHeight, hScreenDC, 0, 0, SRCCOPY);

// --- ... --- //

// Epilogue:

SelectObject(hCaptureDC, hOldBitmap);
DeleteObject(hCaptureBitmap);
DeleteDC(hCaptureDC);
ReleaseDC(0, hScreenDC);
Run Code Online (Sandbox Code Playgroud)

问题是:BitBlt函数是WAY当Aero是打开慢-它需要近50毫秒(这对我来说是不可接受的,因为我需要捕捉多次排在第二).

BitBlt直接从视频硬件获取像素数据.但是在我的测试机器(即Radeon 5470和Radeon 4850)中显卡非常好,所以我不明白什么是错的.我知道这些卡(任何现代卡)在2D中并不像3D那样好,但是我认为简单的blit操作不应该花费50ms.

那么,请你建议做什么?在我的情况下,任何一种"hackish"解决方案(只要它稳定工作)都可以.

目标系统是Win7 x64,32位代码.

提前致谢!

rog*_*ack 0

BitBlt 性能与启用 Aero相关。还有一个 Windows 方法来禁用 aero。我也一直遇到问题,无法通过 Aero 获得超过 15 fps 的速度。诡异的。