获取Direct3D9设备的窗口

时间:2012-07-05 06:36:24

标签: c++ window directx direct3d wndproc

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

1 个答案:

答案 0 :(得分:2)

这就是你在寻找D3D9:

IDirect3DDevice9::GetCreationParameters

您可以使用它来获取用于创建设备的创建参数,包括hFocusWindow。

希望有所帮助。