1

グラフィックスを多用する、DirectX および Windows フォーム上に構築されたアプリケーションを使用しています。これには、自動化されたテスト システムが構築された自動化および再生フレームワークがあります。残念ながら、夜間のビルド中に無人でテストを実行すると、ディスプレイが非アクティブになるか、スクリーンセーバーに拘束されます。当社の IT セキュリティ ポリシーでは、それを無効にすることはできません。

私の質問: ディスプレイなしで実行されているアプリケーションの「スクリーン」キャプチャを行う方法はありますか? レンダリング パイプラインが同じになるようにグラフィックス カードが確実に接続されるようにしたいのですが、テスト フレームワークはディスプレイの状態を気にする必要はありません。

どんな助けでも大歓迎です!

4

4 に答える 4

2

レンダリング パイプラインについて言及されているので、Direct3d を使用していると仮定します。そうであれば、フレームのバックバッファを保存できます。まだVB.Net + MDXを使用していたときにそれを行いました

Dim tempSurface As Direct3D.Surface
tempSurface = device.GetBackBuffer(0, 0, Direct3D.BackBufferType.Mono)
Direct3D.SurfaceLoader.Save(tempFilename, Direct3D.ImageFileFormat.Png, tempSurface)

選択した任意のプログラミング言語を実行するように簡単に変換できます。基本的には、Direct3d の API を呼び出します。ただし、backbuffer と Present パラメーターを次のように構成する必要があります。

' Need to use flip to enable screen capture
presentParams.SwapEffect = Direct3D.SwapEffect.Flip 
presentParams.PresentationInterval = Direct3D.PresentInterval.One
于 2008-10-09T07:28:42.880 に答える
0

このコードは非常に遅いと感じるかもしれませんが、PresentParams.PresentFlag = PresentFlag.LockableBackBuffer

PresentInterval.Oneまた、またはを設定する必要はありませんSwapEffect.Flip。それぞれ .Default と .Discard のままにしておくことができます。

(マルチサンプリングを使用している場合、この高速化は機能しないことに注意してください。必ずPresentParams.Multisample = Multisample.None.

于 2011-04-14T21:16:34.633 に答える
0

VM をインストールし、その中でアプリケーションを実行します。スクリーン セーバーを実行している場合、ビデオ カードがアプリケーションの GUI を生成しているとは思えません。

于 2008-10-08T15:16:40.907 に答える
0

私の理解が正しければ、特定のアプリケーションの画面をキャプチャして、実行中のスクリーンセーバーの影響を受けないようにしたいだけですか? 私の知る限りGetDIBits、正しいウィンドウの HDC で実行するだけでうまくいき、スクリーンセーバーは気にしません。

于 2008-10-08T15:22:07.450 に答える