私はGDI機能で画面をキャプチャするために、次のコードを使用します。BitBltをスピードアップしてスクリーンをエアロでキャプチャするには?
// 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);
問題がある:のBitBlt関数は、エアロがオンされたときにスローWAYである - それはので、私にとっては容認できないとなる(約50ミリ秒を要します私は秒で複数回をキャプチャする必要があります)。
BitBltはビデオハードウェアから直接ピクセルデータを取得します。しかし、ビデオカードは私のテストマシン(つまりRadeon 5470とRadeon 4850)ではかなり良いので、何が間違っているのか分かりません。私はこれらのカード(現代のカード)は3Dであるので2Dでうまくいかないことを知っていますが、単純なblit操作では50msかかるとは思いません。
どうすればいいですか?どんな種類の「ハックな」解決策(私が安定している限り)が私の場合にします。
ターゲットシステムはWin7 x64、32ビットコードです。
ありがとうございます!
Aeroでは、デスクトップはすべてのトップレベルウィンドウの個々のメモリビットマップから合成されます。ライブウィンドウサムネイルやAero Peekなどの機能を有効にします。これはもちろん無料ではありませんし、BitBlt用にハードウェアアクセラレーションが行われることはありません。 CAPTUREBLTオプションをオンにする必要があります。私はそれが大きな違いを生むのではないかと思う。 –