14

FRAPS と同様に、どのアプリケーションが OpenGL または DirectX を使用しているかを検出することは可能ですか? (おそらく何らかの形のフックを使用しています)?実際にウィンドウに描画する必要はおそらくないでしょう。当面の間、何らかの形式の 3D レンダリングを実行しているプロセスを知る必要があるだけです。

(編集:) FRAPS は、3D アプリケーションで「1 秒あたりのフレーム数」カウンターを描画するために使用できるプログラムです。FRAPS は、プロセス名を指定しなくても、実行中のすべての 3D アプリケーションを自動的に検出します。

外部ゲームに引き出された「1 秒あたりのフレーム数」カウンターの例: ここに画像の説明を入力

4

3 に答える 3

9

おそらく最も簡単な方法は、OpenGL および DirectX コア ライブラリの存在を確認することです。おそらく、ドライバー OGL dll も (nvogl など) 追加することをお勧めします。これは、EnumProcesses&を介してEnumProcessModulesEx、p/invoke を使用して実行できます。これにより、少なくとも OGL または DX を使用するプロセスの開始セットが得られます。

もちろん、一部のアプリケーションは両方の API をロードして 1 つだけを使用するか、条件付きで GFX API の 1 つだけを使用します (ただし、後者は特殊なツールなどでのみ発生します)。デバッガーのように何らかの形式のインジェクションまたはプロセスへのアタッチを行い、PresentDX またはwglSwapBuffersOGL のいずれかをフックします。

GDI ハンドルを列挙し、DXGI または OGL レンダー コンテキストを探すことで、フックを使用せずに済むかもしれませんが、これがどれほど実行可能かはわかりません。

于 2012-08-07T11:16:23.907 に答える
8

私が理解している限りでは、FRAPS はどこに店を置くかを決定するために比較的強引なアプローチを使用しています。プロセスは SetWindowsHookEx で開始され、OS が FRAPS フック DLL を実行中のすべてのプロセス [および将来のプロセス] にロードするように要求します。DLL の魔法は、GetModuleHandleA を使用して手続き型の一連のテストを実行し、接続先のプロセスが OpenGL/DirectX モジュールをロードしたかどうかを観察することに帰着します。すべての呼び出しが NULL を返す場合、フックは自分自身をプロセスから削除しようとします。

一方、プロセスがそれらをロードしている場合は、保護を解除して JMP フックを挿入することにより、そのライブラリから適切なレンダリング関数を単純にフックします。wglSwapBuffers は通常、OpenGL で唯一関連するものです。プロセスがこの関数を呼び出すと、最終的に FRAPS モジュールが呼び出され、FRAPS はバック バッファーをキューにキャプチャして AVI にエンコードし、その小さな表示をレンダリングします。次に、wglSwapBuffers の元の要求を処理し、実行をプログラムに返します。

C# でクエリを実行する限り... EasyHook (http://easyhook.codeplex.com/) を確認し、それが機能しないかどうかを確認してください。私は個人的にこの API の経験がありません。

于 2012-08-12T05:08:21.067 に答える
2

Windowsゲームにグラフィックをオーバーレイする方法をご覧ください。リンクされた記事http://www.ring3circus.com/gameprogramming/case-study-fraps/ .

2 番目のリンクには、実際のフック部分を実行する概念コードが含まれています。また、この回答にコピーして貼り付けるよりも、その方法と理由について詳しく説明します。

于 2012-08-08T14:49:10.507 に答える