我通过搜索 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 设备的窗口句柄?