Visual c++ 如何使用aero加速BitBlt捕捉屏幕?

Visual c++ 如何使用aero加速BitBlt捕捉屏幕?,visual-c++,gdi,screen-capture,bitblt,Visual C++,Gdi,Screen Capture,Bitblt,我使用以下代码捕获带有GDI功能的屏幕: // Prologue: int iScreenWidth = GetSystemMetrics(SM_CXSCREEN); int iScreenHeight = GetSystemMetrics(SM_CYSCREEN); HDC hScreenDC = GetDC(0); HDC hCaptureDC = CreateCompatibleDC(hScreenDC); HBITMAP hCaptureBitmap = CreateCompatib

我使用以下代码捕获带有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毫秒

那么,你能告诉我该怎么做吗?在我的情况下,任何一种“黑客”解决方案(只要它稳定工作)都可以

目标系统是Win32 x64,32位代码

提前谢谢

是相关的。
还有一个windows方法可以禁用aero。我也一直有问题获得超过15 fps的空气动力。奇怪。

在Aero中,桌面由所有顶级窗口的单个内存位图合成。它支持实时窗口缩略图和Aero Peek等功能。这当然不是免费的,也不会以任何方式为BitBlt提供硬件加速。你真的应该打开CAPTUREBLT选项。我怀疑这有多大区别。