0

現在、スクリーン キャプチャ プログラムを作成しようとしています。先週、GetFrontBufferData メソッドを試しましたが、成功しました。ただし、そのパフォーマンスはひどいもので、デスクトップ イメージしかキャッチできません。これは、フル スクリーン ゲームの実行を開始すると、GetFrontBufferData メソッドが何も取得しないことを意味します。しかし、私が望むのは、デスクトップの画像ではなく、フルスクリーンのゲームをキャッチすることです。

GetFrontBufferData ソリューションでは、デバイスを作成し、HWND パラメーターを NULL にしました。トップレベル ウィンドウのハンドル (つまり、フル スクリーン ゲームのハンドル) を取得して CreateDevice メソッドに渡すと、そのスクリーン ショットを取得できます。

実際、私はDX9に基づいたスクリーンキャプチャ方法をいくつか試しました。画面キャプチャの最速の方法に関する質問を調べ、GetRenderTarget() メソッドと GetRenderTargetData() を組み合わせて試しました。問題は、プログラム自体によってレンダリングされた Render データしか取得できないことです。GetBackBuffer() についても同様です。

トップレベル ウィンドウのハンドルを取得できれば、特定のウィンドウ イメージ (実行中のフル スクリーン ゲームなど) を取得できますか? Win32 - Get Main Wnd Handle of applicationに記載されている EnumWindow メソッドを確認しました。私のテストによると、このコードはプログラム自体によってのみ作成されたウィンドウを取得するようです。ただし、他のプログラムでいくつかのウィンドウを作成する必要があります。

それが私の質問です。一言で言えば、私は 2 つのことを知りたいです。2、それが正しい場合、ハンドルを取得する方法; それが間違っている場合、フルスクリーンのゲームをキャプチャする正しい方法は何ですか?

4

1 に答える 1

0
  1. そうではありません。CreateDevice に渡されたウィンドウ ハンドルはスクリーン キャプチャとは関係ありません。アプリがバックグラウンドになったときに Direct3D に警告するのはウィンドウです。別のアプリから画面データ ストリームをキャプチャしたいので、ここのウィンドウ ハンドルは役に立ちません。

  2. パフォーマンスが重要であり、GetFrontBufferData には時間がかかるため、必要に応じて適切だと思う唯一の方法は、Direct3D をフックし、Present の呼び出しを中断し、バックバッファーからデータを取得することです。その後、必要なことを行うことができます。私はフックに慣れておらず、Direc3D をフックしたことはありません。

ここでは、CreateDevice で使用される 2 つのウィンドウ ハンドルについて説明します (DirectX SDK ドキュメントから)。

Direct3D デバイスを作成するときは、フォーカス ウィンドウ (hFocusWindow) とデバイス ウィンドウ (D3DPRESENT_PARAMETERS の hDeviceWindow) という 2 つの異なるウィンドウ パラメータを指定します。各ウィンドウの目的は次のとおりです。 フォーカス ウィンドウは、アプリケーションが (Alt-Tab、マウス クリック、またはその他の方法で) フォアグラウンド モードからバックグラウンド モードに切り替わったときに、Direct3D に警告します。単一のフォーカス ウィンドウは、アプリケーションによって作成された各デバイスで共有されます。デバイス ウィンドウは、画面上のバック バッファーの位置とサイズを決定します。これは、バック バッファーの内容がフロント バッファーにコピーされるときに、Direct3D によって使用されます。

現在。

于 2013-07-26T09:07:11.703 に答える