46

サードパーティのフルスクリーンWindowsアプリケーションの上にカスタムグラフィックを表示したい。

Steamゲームをプレイしたことがありますか?ゲーム内からSteamウィンドウにアクセスできる実行可能ファイルGameOverlayUI.exeがあります。(GUI要素はカスタム描画されているように見えますが、それが必要かどうかはわかりませんが、ゲーム内ではデスクトップとまったく同じように見えます。)ゲームのグラフィックを「暗く」することさえできます。背景。

どうすればそのようなアプリケーションを作成できるのだろうか。

また、ソリューションの範囲がどれほど広いのか疑問に思っています。すべてのOpenGLアプリケーションに1つの方法を使用できますか?すべてのDirect3DからDirectDrawアプリケーションを除いたものですか?すべてのフルスクリーンWindowsアプリケーションの場合?

私はもっ​​と「現代的」で一般的な解決策を探しています-コマンドプロンプトや320x240インデックスカラーアプリケーションのオーバーレイは問題ではありません。

編集:いくつかの説明:フルスクリーンアプリケーションは私のものではありません。何でもかまいません。おそらく、それは3Dゲームになるでしょう。たとえば、画面の右下隅のゲームグラフィックの上にデジタル時計を表示したいと思います。可能であれば、コードの挿入やプロセスのデバッグなどのトリックは避けたいと思います。

4

4 に答える 4

27

さて、これが別の例です。Xfire は、そのインターフェイスをゲームにオーバーレイするチャット プログラムで、プレイ中にメッセージを受け取ることができます。彼らがこれを行う方法は、アセンブリ ジャンプを挿入するように、プロセス メモリ レベルで d3d/opengl DLL を編集することです。彼らの方法が私のモッドをクラッシュさせていたので、私はこれを知っています.d3d9.dllに注入された奇妙なアセンブリコードを実際に見ました.

Xfire がこれを行う方法は次のとおりです。

  1. ゲームのプロセスをターゲットにする
  2. d3d.dll/opengl.dll のプロセス メモリを検索します。
  3. カスタム インターフェイス ロジックを含む DLL をプロセスに挿入する
  4. プロセス メモリにある d3d/opengl 関数にアセンブリ ジャンプを手動で記述することにより、インターフェイスの関数をプログラム フローに接続します。

そのゲームに属するグラフィックス デバイスをハイジャックする必要があるため、他に考えられる方法はありません。Steam が Xfire と同じ方法でそれを行うことは間違いありません。そうです、誰かが低レベルで必要なすべてを行うのに役立つライブラリを作成しない限り、これを行う簡単な方法はありません。

また、オーバーレイの下のゲーム グラフィックを暗くすることについても尋ねました。DrawPrimitiveこれは、画面上に塗りつぶされた透明な四角形を描画するための単純な呼び出しです。

于 2009-11-05T20:54:30.603 に答える
25

ここに完全なコードを含む Gist を作成しました

これはかなり難解な芸術であり、これを行うにはいくつかの方法があります。私はDirect3D Wrapperと呼ばれるものを好みます。何年も前からやっていますが、ゲームで一度やったことがあります。いくつかの詳細を省略している可能性がありますが、アイデアを説明したいと思っています。

すべての Direct3D9 ゲームは、画面がレンダリングされて描画の準備が整った後で、IDirect3DDevice9::EndSceneを呼び出す必要があります。EndSceneしたがって、理論的には、ゲーム上で必要なものを描画するカスタム コードを内部に入れることができます。これを行うには、IDirect3DDevice9 のようなクラスをゲームに作成しますが、これは実際には、すべての関数呼び出しを実際のクラスに転送するラッパーにすぎません。したがって、カスタム クラスでは、ラッパー関数はEndScene次のようになります。

HRESULT IDirect3DDevice9::EndScene()
{
   // draw overlays here

   realDevice.EndScene();
}

次に、それを d3d9.dll という DLL にコンパイルし、ゲームの実行可能ファイルのディレクトリにドロップします。実際の d3d9.dll は /system32 フォルダーにあるはずですが、ゲームは最初に現在のディレクトリを検索し、代わりに私たちのディレクトリを読み込みます。ゲームが読み込まれると、DLL を使用してラッパー クラスのインスタンスが作成されます。そして、 が呼び出されるたびEndSceneにコードが実行され、必要なものが画面に描画されます。

OpenGLでも同じ原理を試すことができると思います。しかし、改ざんを防ぐために、最近のゲームの中にはこれを防ごうとしているものがあると思います。

于 2009-11-02T17:51:34.433 に答える
0

私はこれについて考えてきました。OpenGL の場合、WGL の SwapBuffers を Detours でフックし、ゲームの後に自分のものを描画してから、バッファーを自分で交換します。

于 2009-11-16T18:11:33.810 に答える
-1

DirectXとWPFの両方のビューポート(実際には同じこと)でオーバーレイを実行し、オーバーレイを使用して3Dビジュアライゼーションの上にいくつかの優れた2DGDI+のものをペイントしました。

「実際の」視覚化の上にあるパネルを使用して、オーバーレイしたいビットを除いて色を透明に設定することで管理しました。かなりうまく機能しましたが、クリック、ドラッグ、その他のイベントを「描画」レイヤーから3Dコントロールに渡すのは少し面倒でした。

于 2009-05-29T13:39:45.407 に答える