我正在通过搜索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设备的窗口句柄?
答案 0 :(得分:2)