2

BitBlt を使用して、ユーザーのデスクトップ上のウィンドウのスクリーンショットを取得しています。ほとんどのプログラムのウィンドウですべてがうまく機能することがわかりました。ただし、BitBlt は Office 2013 ウィンドウ (Word、Powerpoint など) に対して空白のピクセルを返します。

PrintWindow はこれらの Office 2013 ウィンドウで機能しますが、プロセッサのオーバーヘッドが高くなります。可能であれば、BitBlt を使用したいと思います。

BitBlt が Office 2013 ウィンドウで動作しない理由はありますか?

以下のコード スニペット。

ありがとう

更新: BitBlt(...) は true を返します。appWin ではなくデスクトップ全体をキャプチャするようにコードを変更すると、Office 2013 ウィンドウが正しくキャプチャされます。この投稿を参照してください。デスクトップ全体をキャプチャして、目的のウィンドウを抽出できます。ただし、これは、ソフトウェアがフォアグラウンドにないウィンドウから画像をキャプチャできるようにする新しい DWM で 1 つの優れた機能を失います。

システムがOffice 2013タイプのウィンドウをキャプチャし、フォアグラウンドにないウィンドウから画像をキャプチャできるようにする、これを行うためのより良い方法はありますか?

更新 2: appWin で BitBlt を実行すると、最初の BitBlt は有効なピクセル データを提供するように見えますが、後続の BitBlt は空白のピクセルを提供します。理由は不明ですが、重要なデータ ポイントである可能性があります。

INT texUSize = 1024;
INT texVSize = 1024;

RECT rect;
GetClientRect(appWin, &rect);
INT appW = rect.right - rect.left;
INT appH = rect.bottom - rect.top;

// create BITMAP in memory, write to texture pixels from BITMAP
HDC hdc = GetDC(appWin);
HDC hdc_App = CreateCompatibleDC(hdc);
HDC hdc_Tex = CreateCompatibleDC(hdc);
HBITMAP hbmp_App = CreateCompatibleBitmap(hdc, appW, appH);
HBITMAP hbmp_Tex = CreateCompatibleBitmap(hdc, texUSize, texVSize);
HBITMAP hbmp_AppOld = (HBITMAP)SelectObject(hdc_App, hbmp_App);
HBITMAP hbmp_TexOld = (HBITMAP)SelectObject(hdc_Tex, hbmp_Tex);

// Due to the new Desktop Window Manager, Windows Vista and Windows 7 can simply BitBlt the app window
// Windows XP has issues with BitBlt if app window is covered by a different window
if (false)//bVista7 || (GetForegroundWindow() == appWin))
{
    appOutputDebugStringf(TEXT("-- bitblting"));
    BitBlt(hdc_App, 0, 0, appW, appH, hdc, 0, 0, SRCCOPY);
}
else
{
    appOutputDebugStringf(TEXT("-- printwindow"));
    PrintWindow(appWin, hdc_App, NULL);
}
4

0 に答える 0