2012-07-05 31 views
1

我通過搜索VTable並將我自己的方法附加到所選參考函數的起始處並繞過繞線來連接Direct3D9設備。獲取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設備的窗口句柄?

回答

2

這是你在找什麼D3D9:

IDirect3DDevice9::GetCreationParameters

你可以用它來獲取用於創建包括hFocusWindow設備創建PARAMATERS。

希望有所幫助。

+0

找不到內容。你能糾正鏈接嗎? – kvanberendonck

+0

謝謝!我們有一個贏家 – kvanberendonck

+0

窗口句柄可能不是作爲參數傳遞給'CreateDevice',而是作爲'D3DPRESENT_PARAMETERS'結構的一部分傳遞,在這種情況下,您的方法將返回NULL。 – riv