1

画面のスナップショットを最も効率的な方法で取得したいと考えています。これは、他の計算負荷の高いプログラム (ゲーム) が実行されているときにバックグラウンドで実行されるプログラムで使用され、パフォーマンスに (あまり) 影響を与えたくありません。スクリーンショットは 1 秒間に複数回 (10 回以上) 発生するため、できるだけ高速にしたいと考えています。

理想的には Delphi コードを探していますが、これに最適なものは何でも受け入れます。これがうまく機能する最初の機能を見つけました。これがこれを行うための最速の方法であることを誰かが確認/デバンクできますか?

さらに、特定のアプリケーション (例: skyrim) は画面全体を取得し、上記で使用されているウィンドウ システムをバイパスしていると思います。上記のリンクはそれらの画像を取得できません。誰かがそれらをつかむ方法について考えを持っていますか?

4

1 に答える 1

2

Windowsアプリのみを意味していると思いますか?しかし、ウィンドウの場合でも、あなたが尋ねたほど効率的に行う方法はありません。多くのコンピューターでは、アプリが実行中の唯一のアプリであっても、10 以上の FPS を得ることができません。おそらく最も効率的な方法は、ミラーリング ドライバーを使用することです。この場合、常に画面のコピーが表示されますが、特に 3D ゲームなどの負荷の高いアプリケーションでは、ドライバーもパフォーマンスに影響します。(10 以上の画面で何をするのか、私は尋ねません。なぜなら、何をするにしても、CPU または HDD の時間がかかり、3D アプリも遅くなるからです)。

もちろん画面全体だけでなく、任意の部分をキャプチャできます。次の例のように bitblt を使用できます。

procedure CaptureFromScreen(Dest: TBitmap; x, y, w, h, screenx, screeny: integer);
var
  DC: hWnd;
begin
  DC := GetDC(0);
  if DC = 0 then
    exit;
  bitblt(dest.canvas.handle, x, y, w, h, DC, screenx, screeny, SRCCOPY);
  ReleaseDC(0, DC);
end;

SRCCOPY の代わりに (CAPTUREBLT または SRCCOPY) を使用すると便利な場合があります。透明なアイテムをキャプチャするのに役立ちますが、カーソルが点滅するなどの副作用があります。オーバーレイから画像をキャプチャする方法がわかりません。映画を見ている場合、ほとんどの場合、プレーヤーはオーバーレイを使用し、BITBLT は画像ではなく 1 つの色で塗りつぶされた領域を返します。

于 2013-08-23T12:23:04.423 に答える