サードパーティのフルスクリーンWindowsアプリケーションの上にカスタムグラフィックスを表示したい。
Steamゲームをプレイしたことがありますか?実行可能なGameOverlayUI.exeがあり、ゲーム内からSteamウィンドウにアクセスできます。 (GUI要素はカスタム描画されているように見えますが、それが必要かどうかはわかりませんが、ゲーム内ではデスクトップ上とまったく同じに見えます。)背景。
このようなアプリケーションを作成するにはどうすればよいのでしょうか。
また、ソリューションの範囲がどれほど広いかについても疑問です。すべてのOpenGLアプリケーションに1つの方法を使用できますか?すべてのDirect3DからDirectDrawアプリケーションを除いて?すべてのフルスクリーンWindowsアプリケーションですか?
私はもっと「現代的」で一般的なソリューションを探しています-コマンドプロンプトや320x240のインデックス付きカラーアプリケーションのオーバーレイは問題ではありません。
編集:いくつかの説明:フルスクリーンアプリケーションは私のものではありません。何でもかまいません。おそらく、それは3Dゲームでしょう。画面右下のゲームグラフィックの上にデジタル時計を表示したいと思います。可能であれば、コードの挿入やプロセスのデバッグなどのトリックは避けたいと思います。
さて、ここに別の例があります。 Xfireは、ゲームにインターフェイスをオーバーレイして、再生中にメッセージを受信できるチャットプログラムです。彼らがこれを行う方法は、アセンブリジャンプの注入のように、プロセスメモリレベルでd3d/opengl DLLを編集することです。彼らの方法が私のmodをクラッシュさせる原因だったので、私はこれを知っています。彼らがd3d9.dllに注入していた奇妙なアセンブリコード。
Xfireがこれを行う方法は次のとおりです。
そのゲームに属するグラフィックスデバイスをハイジャックする必要があるため、他に考えられる方法はありません。 SteamがXfireと同じ方法でそれを行うことを私は喜んで賭けます。だから、ええ、誰かがあなたが低レベルでする必要があるすべてをするのに役立つライブラリを作成しない限り、これを行う簡単な方法はありません。
また、オーバーレイの下でゲームグラフィックスを暗くすることについても質問しました。これは、画面上に塗りつぶされた透明な長方形を描画する単純なDrawPrimitive
呼び出しです。
完全なコードで要旨を作成 ここ
これはかなり難解な芸術であり、これを行うにはいくつかの方法があります。 Direct3Dラッパーと呼ばれるものを好みます。私がこれを行ってから数年が経ちましたが、ゲームで1回やりました。詳細は省略しているかもしれませんが、そのアイデアを説明したいだけです。
すべてのDirect3D9ゲームは、画面がレンダリングされて描画の準備ができた後で IDirect3DDevice9 :: EndScene を呼び出す必要があります。したがって、理論的には、ゲーム上で必要なものを描画するカスタムコードをEndScene
内に配置できます。これを行うには、ゲームに対してIDirect3DDevice9のようなクラスを作成しますが、実際には、すべての関数呼び出しを実際のクラスに転送するラッパーにすぎません。したがって、カスタムクラスでは、EndScene
のラッパー関数は次のようになります。
HRESULT IDirect3DDevice9::EndScene()
{
// draw overlays here
realDevice.EndScene();
}
次に、それをDLL d3d9.dllと呼ばれる)にコンパイルし、ゲームの実行可能ファイルのディレクトリにドロップします。実際のd3d9.dllは/ system32フォルダーにあるはずですが、ゲームは最初に現在のディレクトリ、そして代わりに私たちのものをロードします。ゲームがロードされると、ゲームはDLLを使用してラッパークラスのインスタンスを作成します。そして、今度はEndScene
が呼び出されるたびに、コード画面に必要なものを描画するために実行されます。
OpenGLでも同じ原則を試すことができると思います。しかし、改ざんを防ぐために、最近のゲームの中にはこれを防ごうとするものがあると思います。
フリーソフトウェアプロジェクトの名前はtaksi リンクテキスト です。このアプリケーションがプロセスをオーバーライドする方法がわからないので、コードを調べていますが、これは良いプロジェクトだと思います
私はこれについて考えてきました。 OpenGLの場合、WGLのSwapBuffersを迂回路にフックし、ゲームの後で自分のものを描画してから、自分でバッファーを交換します。