4

System.Drawing.Graphics.CopyFromScreen を使用して、デスクトップの部分的なスクリーンショットを取得しています。奇妙な行動に気付きました。一部のマシンでは、アプリケーション (WPF) ウィンドウに allowTransparency="True" がある場合、CopyFromScreen を呼び出すと、ウィンドウの下にあるものをキャプチャします。ただし、他のマシンでは、呼び出しウィンドウもキャプチャします。

多くのマシンやオペレーティング システムで試してみましたが、パターンは見つかりませんでした。XP および Windows 7 ラップトップでは、透明なウィンドウの下をキャプチャします。私たちが持っている 1 つの Windows 7 デスクトップでは、ウィンドウ自体をキャプチャします。Aero、またはその他の Windows 7 ディスプレイ機能は、違いがないようです。

グラフィックカードの問題でしょうか?すべてのマシンで一貫した動作を取得する方法、またはこの問題がいつ発生するかを予測または検出する方法はありますか?

EDIT以下の Hans Passant によって提供されたリンクと、さらにいくつかのテストのおかげで、この問題がウィンドウの透明度のみに関連していることがわかりました。一部のマシンでは、CopyFromScreen はすべてのウィンドウをキャプチャしますが、他のマシンでは不透明なウィンドウのみをキャプチャします。

4

1 に答える 1

4

時々そうでない動作についてはよくわかりません。レイヤード ウィンドウは、Aero 以来、奇妙な動作をしています。明確なのは、CopyPixelOperation を指定するオーバーロードを使用しない限り、Graphics.CopyFromScreen() がデフォルトでレイヤード ウィンドウをキャプチャしないことです。必要なオプションは CaptureBlt で、次のように説明されています。

ウィンドウの上に重ねられたウィンドウは、結果のイメージに含まれます。デフォルトでは、画像にはウィンドウのみが含まれます。

これは正確ではありません。レイヤード ウィンドウの場合、「あなたのウィンドウ」はキャプチャされません。さらに悪いことに、メソッドにはバグがあります。CaptureBlt だけでなく、SourceCopy も必要です。また、引数の検証コードはその組み合わせを許可していないため、使用しようとすると InvalidEnumArgumentException が発生します。

まあ、GDI+ はバッグ 'o バグです。この回答で、これを回避するために必要な醜い pinvoke コードを見つけることができます。

于 2012-04-27T16:31:23.627 に答える