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 デバイスのウィンドウ ハンドルを取得するにはどうすればよいですか?