5

Chrome ウィンドウのスクリーンショットを撮ろうとしています。次のようになります。

クロムウィンドウ

スクリーンショットを取得するために使用PrintWindowすると、ウィンドウのタイトルバー/Chrome タブ領域にちらつきが表示されます。キャプチャされたスクリーンショットには、Windows Basic スタイルのタイトルバーの奇妙なレンダリングが含まれています (私のマシンは Aero テーマを実行していますが)。

撮影画像

他のいくつかのアプリも同様の動作を示し、画面上でちらつきますが、キャプチャされたスクリーンショットにはタイトルバーのアーティファクトが表示されないことに気付きました。これを行うアプリには、Office 2010、IE 10、および Trillian タブ付きチャット ウィンドウが含まれます。つまり、非クライアント領域を拡張するウィンドウには、この問題があるようです。

これを再現するコードは単純です。

void Screenshot(HWND hWnd) {

    RECT rc;
    GetClientRect(hWnd, &rc);

    HDC hdcScreen = GetDC(NULL);
    HDC hdc = CreateCompatibleDC(hdcScreen);
    HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, 
        rc.right - rc.left, rc.bottom - rc.top);
    SelectObject(hdc, hbmp);

    //Print to memory hdc
    PrintWindow(hWnd, hdc, PW_CLIENTONLY);

}

ちらつきや奇妙な視覚的アーティファクトが表示されるのはなぜですか? それを止めるにはどうすればよいですか?

4

2 に答える 2

1

Aero が有効になっている場合は、代わりに BitBlt を使用してください。

chromium デスクトップ キャプチャ ソース コードの次のコメントは特に役に立ちました。

// When desktop composition (Aero) is enabled each window is rendered to a
// private buffer allowing BitBlt() to get the window content even if the
// window is occluded. PrintWindow() is slower but lets rendering the window
// contents to an off-screen device context when Aero is not available.
于 2016-04-22T19:00:52.583 に答える