質問

サードパーティの全画面 Windows アプリケーションの上にカスタム グラフィックを表示したいと考えています。

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

どうすればそのようなアプリケーションを作成できるのか疑問に思っています。

また、解決策の範囲がどの程度広がるのかも気になります。すべての OpenGL アプリケーションに対して 1 つの方法を使用できますか?DirectDraw を除いたすべての Direct3D アプリケーションについて?すべての全画面 Windows アプリケーションが対象ですか?

私は、より「最新の」汎用ソリューションを探しています。コマンド プロンプトや 320x240 のインデックス付きカラー アプリケーションをオーバーレイすることは問題ではありません。

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

役に立ちましたか?

解決

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

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

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

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

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

他のヒント

ここ

完全なコードと要旨を作成しました

これはかなり難解な芸術であり、そしてこれを行うには、いくつかの方法があります。私はのDirect3Dのラッパーのと呼ばれるものを好みます。私はこれをやったので、それは年をされているが、私は一度のゲームでそれをやりました。私はいくつかの詳細を残しているかもしれませんが、私はアイデアを説明したいと考えています。

すべてのDirect3D9ゲームは呼び出す必要が IDirect3DDevice9 :: EndScene画面を描画して準備された後にを描画します。だから、理論的には、我々はゲーム上で何をしたい描くことEndScene内部のカスタムコードを置くことができます。私たちは、ゲームにIDirect3DDevice9ように見えるクラスを作成することによって、これを行うが、それは本当に本当のクラスにすべての関数呼び出しを転送するだけのラッパーです。だから今、私たちのカスタムクラスでは、EndSceneための私たちのラッパー関数は次のようになります:

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

   realDevice.EndScene();
}

その後、我々はd3d9.dllと呼ばれるDLLにコンパイルし、ゲームの実行可能ファイルのディレクトリにドロップします。本当のd3d9.dllは/ system32フォルダにする必要がありますが、ゲームは最初に現在のディレクトリを検索し、代わりに私たちをロードします。ゲームをロードしたら、それは私たちのラッパークラスのインスタンスを作成するために、私たちのDLLを使用しています。そして今、それぞれの時間EndSceneは、当社のコードは、我々が画面に欲しいものを描くために実行される、と呼ばれています。

私はあなたがOpenGLと同じ原理を試すことができると思います。しかし、改ざんを防止するために、私はいくつかの現代のゲームはこれを防ぐためにしようと考えてます。

その名は、それがtaksi リンクテキストでのフリーソフトウェアプロジェクトはtherers。私は、このアプリケーションは、私はまだコードを調べることだプロセスの原因をオーバーライドするかどうかはわかりませんが、私はこれは良いプロジェクト

であるcheckitだと思います

私はこのことについて考えてきました。 OpenGLのために、私は試合後に私のものを描画して、バッファを自分で交換する、迂回とWGLのSwapBuffersをフックと思います。

私は、3Dビジュアライゼーションの上にいくつかの素晴らしい2DのGDI +のものをペイントするオーバーレイを使用して、DirectXの&WPFの両方のビューポート(同じ事、本当に)とのオーバーレイをやっています。

私は重ねたかったビットを除いて透明に色を設定し、「実際の」見える化の上にパネルを使用して管理しました。かなりうまく働いたが、それは痛みのビットが3Dコントロールに「描画」層を介してクリック、ドラッグ、および他のイベントを渡しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top