3

私たちが起動した任意のアプリケーションのスクリーンショットを撮りたい C# (WPF) アプリケーションがあります (つまり、開始したプロセスへの参照があるため)。アプリケーションは最小化されているか、他のウィンドウの背後にある可能性がありますが、ピクセルの重なりではなく、個々のアプリケーションの画像のみが必要です。

BitBlt またはPrintWindowを使用した典型的な P/Invoke ソリューションがほとんどの場合機能することは知っていますが、グラフィック デバイスに直接描画する DirectX または OpenGL アプリケーションを処理する場合、それらは失敗します (黒/透明ピクセルしか得られません)。C# から Direct3D アプリのスクリーンショットを撮ることに関するこの記事を見つけたので、そのケースをカバーしたと思います。

だから私の質問はこれです:

  1. OpenGL アプリケーションでこれを行うにはどうすればよいですか?
  2. 使用する適切な方法 (PW/DX/GL) を決定する最も簡単な方法は何ですか?
  3. これを行うための単一の普遍的な方法はありますか?

#2 については、実行可能ファイルによってロードされたモジュールを検査し、DirectX または OpenGL DLL/アセンブリがロードされているかどうかを確認する必要がありますか?

これは Windows XP でのみ実行する必要があります (クロスプラットフォームではなく、このアプリケーションがすぐに Vista/7 に移行することはありません)。

4

1 に答える 1

1

1 の答え: OpenGL では、glReadBuffer と glReadPixels を呼び出して、画面のビットマップを取得できます。ただし、これは遅いため (フレームごとに繰り返し呼び出さないため)、GL ウィンドウが別のアプリケーション/ウィンドウと重なっている場合にも問題が発生する可能性があります。これを行う正しい方法は、 pbufferを使用して「テクスチャにレンダリング」(Google で検索) することです。

2 のアイデア: ウィンドウへのハンドルがある場合は、それが持つpixelformatdescriptor構造を取得して確認できる場合があります。しかし、それを試したことはありません。

3: ところで、これを問題なく行うための普遍的な方法は 1 つもないと思います..

于 2009-04-17T20:37:20.610 に答える