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 回答