2009-04-16 39 views
3

私たちが起動した任意のアプリケーションのスクリーンショットを撮るC#(WPF)アプリケーションがあります。 アプリケーションは最小化されていても、他のウィンドウの後ろに置かれていても構いませんが、依然として個々のアプリケーションの画像が必要です。C#を使用して任意の外部アプリケーションのスクリーンショットを撮る

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

だから私の質問はこれです:私は、OpenGLアプリケーションのためにこれを行うだろうか

  1. (PW/DX/GL)を使用する適切な方法を決定する最も簡単な方法は何ですか?
  2. これを行う普遍的な方法は1つありますか?

#2の場合、実行可能ファイルによって読み込まれたモジュールを調べ、DirectXまたはOpenGL DLL /アセンブリが読み込まれているかどうかを確認することに専念しましたか?

これはWindows XPでのみ実行する必要があります(クロスプラットフォームではなく、いつでもVista/7には向かない)。

答えて

1

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

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

:ところで、私は何の問題もなくこれを行うための一つの普遍的な方法があるとは思わない。私はそれを見てみましょう

+1

。 OpenGLアプリケーションのバックバッファーを取得し、それらのピクセルのコピーを取得する方法はありますか?再:#3 - それは希望的な考えだが、誰かが道を見つけたかもしれない。頼むように傷つきませんよね? (投票しなければ、つまり) –

+0

これは、バックバッファとコピーを取得するglReadBuffer(GL_Back)とglReadPixelsです。 – mentat

関連する問題