1


0

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

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

どうぞよろしくお願いいたします。

4 Answer


2


レンダリングパイプラインについて述べたので、Direct3dを使用していると仮定します。その場合は、フレームのバックバッファを節約できます。 私はまだVB.Net MDXを使用していたとき私はそれをしました

Direct3D.Surfaceとして薄暗いtempSurface = device.GetBackBuffer(0、0、Direct3D.BackBufferType.Mono)Direct3D.SurfaceLoader.Save(tempFilename、Direct3D.ImageFileFormat.Png、tempSurface)

あなたは簡単に変換することができますそれはあなたが選択した任意のプログラミング言語を行います、それは基本的にDirect3dのAPIを呼び出します。 ただし、バックバッファとPresentパラメータを次のように設定する必要があります。

'画面キャプチャを有効にするにはフリップを使用する必要がありますpresentParams.SwapEffect = Direct3D.SwapEffect.Flip presentParams.PresentationInterval = Direct3D.PresentInterval.One


0


VMをインストールしてその中でアプリケーションを実行します。 あなたがスクリーンセーバーを実行しているなら、私はあなたのビデオカードがアプリケーションのためのGUIさえ生成しているのではないかと疑います。


0


私が正しいと理解したなら、あなたがしたいのは特定のアプリケーションのスクリーングラブを取ることであり、結果はおそらく実行中のスクリーンセーバーの影響を受けませんか? 私の知る限りでは、正しいウィンドウのHDC上で単に `GetDIBits`を実行することはトリックをするべきであり、スクリーンセーバーを気にする必要はありません。


0


このコードは本当に遅いと思うかもしれませんが、 `PresentParams.PresentFlag = PresentFlag.LockableBackBuffer`を設定することで非常に高速化することができます。

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

(マルチサンプリングを使用している場合、このスピードアップは機能しませんので、 `PresentParams.Multisample = Multisample.None`を確実にしてください。 Nvidiaカードをお持ちの場合でも、Nvidiaコントロールパネルのオプションを設定してアプリケーションの設定を必要な設定に上書きすることで、アンチエイリアシングを取得できます。