3

ウィンドウの画像をキャプチャする通常の方法は、次を呼び出すことです。

HDC SharedWndDC = GetWindowDC(SharedWnd);
BitBlt(BitmapDC, 0, 0, width, height, SharedWndDC, 0, 0, SRCCOPY /* |CAPTUREBLT */);
ReleaseDC(SharedWnd, SharedWndDC);

DWM を実行しているシステムでは、問題のウィンドウが他のウィンドウと重なっていたり、部分的に画面から外れていたりしても、問題のウィンドウだけを適切に取得します。

ただし、一部のウィンドウ (おそらく WPF を使用するウィンドウ) では正しく機能せず、ガラス領域でおかしな動作をします。基本的に、GDI キャプチャは GDI 以外のものでは機能しません。

Direct3D の「バック バッファー」または「フロント バッファー」を取得することが本当に必要なことは理解していますが、私が見た多くの例は、画面全体またはデスクトップをキャプチャするためのものです。Direct3D を知らないので、既存の windowの適切なオブジェクトを取得する方法の例や簡単なステートメントを見つけることができず、そこからバッファーを取得できます。

誰か親切な魂が、少なくとも欠けているピースを見せてくれるでしょうか?

—ジョン

4

1 に答える 1

1

画面全体をキャプチャせずにフロント バッファの内容をキャプチャする方法はないと思います。バック バッファは、Direct3D を実行しているアプリケーション専用です。フロント バッファの内容は、グラフィック カードが実際にデータをモニタに表示する場合にのみ見ることができます。GDI では、Windows がフロント バッファーとバック バッファーを管理しているため、Windows はフロント バッファーとバック バッファーにアクセスできます。しかし、Direct3D (そして私は WPF を想定しています) では、これは当てはまりません。Windows はバッファにアクセスできないため、アプリケーションが Windows にデータを渡さない限り、データを取得できません。これは不可能です (そうするように定義されたメッセージはありません)。

編集:

これは死んだ質問のように見えますが、他の誰かが答えを探している場合に備えて、とにかくこれを追加します. 前述の問題は、ウィンドウの内容をプログラムで取得する場合にも当てはまります。ただし、Windows では、キャプチャするウィンドウにキーボード フォーカスがある場合 (つまり、アクティブなウィンドウ)、ショートカット ALT + Print Screen を使用して、単一のウィンドウの内容を取得することができます。これは役に立つかもしれませんし、役に立たないかもしれませんが、問題のウィンドウだけの内容をキャプチャします。

于 2012-01-18T03:28:19.497 に答える