我使用以下代码通过 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);
问题是:当 Aero 打开时, BitBlt功能非常慢 - 它需要将近 50 毫秒(这对我来说是不可接受的,因为我需要在一秒钟内捕获多次)。
BitBlt 直接从视频硬件获取像素数据。但是显卡在我的测试机器(即 Radeon 5470 和 Radeon 4850)中相当不错,所以我不明白哪里出了问题。我知道这些卡片(任何现代卡片)在 2D 中不如在 3D 中那么好,但我认为简单的 blit 操作不应该花费 50 毫秒。
所以,你能建议怎么做吗?在我的情况下,任何类型的“hackish”解决方案(只要它可以稳定工作)都可以。
目标系统是 Win7 x64,32 位代码。
提前致谢!