1

VTable を検索し、迂回して選択した参照関数の先頭に独自のメソッドを追加することで、Direct3D9 デバイスをフックしています。

D3DEndScene = (lpfnD3DEndScene)((LPVOID)dwVTable[VD3D_ENDSCENE]); // 35 dx8
D3DResetDevice = (lpfnD3DResetDevice)((LPVOID)dwVTable[VD3D_RESET]); // 14 dx8

DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());

DetourAttach(&(PVOID&)D3DEndScene, D3DEndScene_Hook);
DetourAttach(&(PVOID&)D3DResetDevice, D3DResetDevice_Hook);

DetourTransactionCommit();

それはうまくいっています。

その結果、「pDevice」と呼んだ Direct3D9 デバイスにアクセスできます。

HRESULT WINAPI D3DEndScene_Hook (LPDIRECT3DDEVICE9 pDevice)

pDevice が使用しているウィンドウ ハンドルを抽出して、WndProc 属性をフックし、キーボード/マウス イベントを除外する (そしてそれらを自分で処理する) ことができるようにしたいと考えています。SetWindowLong を使用して既存の WndProc を検索できることはわかっていますが、実際にデバイスから任意の形式のウィンドウ ハンドルを取得する方法がわかりません。

私が知っていることは、メソッド IDirect3D9::CreateDevice に、私が探しているもののように見える引数 hFocusWindow があるということです。しかし、作成後にアクセスする方法がわかりません。

CreateDevice のフックは、デバイスが作成されるまでフックしないため、時間内に関数をキャッチできないため、私にとってはあまり良いオプションではありません。

D3D9 デバイスのウィンドウ ハンドルを取得するにはどうすればよいですか?

4

1 に答える 1

2

これは、D3D9 を探しているものです。

IDirect3DDevice9::GetCreationParameters

これを使用して、hFocusWindow を含むデバイスの作成に使用される作成パラメーターを取得できます。

それが役立つことを願っています。

于 2012-07-05T14:15:24.403 に答える