我想學習Windows API。目前我在嘗試使鉤子工作時遇到很多麻煩。我有一些示例代碼我已經搞亂了幾天 - 它有一個用C#編寫的GUI或者其他東西,還有一個C++的dll。該DLL具有此功能外化:SetWindowsHookEx(),掛鉤不維護? (可能)
bool __declspec(dllexport) InstallHook(){
g_hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, g_hInstance, 0);
return g_hHook != NULL;
}
CBT PROC是這樣的,也是在DLL:
LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam){
if (nCode < 0)
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
/* Something should go here to do stuff when certain nCodes are recieved.*/
return 0;
}
當我運行這個傢伙的代碼,一切工作正常。他調用了安裝在C#GUI中某處的InstallHook(),如果我在CBTProc函數中放置了一個斷點,我可以看到它被系統反覆調用。正如我真的不明白C#,我想用下面的(微小)控制檯應用程序來削減它:
int _tmain(int argc, _TCHAR* argv[]){
bool bbbb = InstallHook();
Sleep(2000);
return 0;
}
我的問題是,如果我這樣做,鉤不再工作。通過調試器,我可以看到InstallHook()被正確調用,並且該函數中的g_hHook不爲null,但CBTProc函數完全沒有被調用 - 它就好像系統離開InstallHook時忘記鉤子一樣()函數。
任何人都可以照亮這個問題嗎?我一直拉着我的頭髮好幾天試圖讓它工作,但我沒有運氣。
工作,謝謝。它有點煩人,因爲我的程序現在已經從一個很酷的4行到100個初始化所有的窗口的東西,但我很高興它的工作原理。 – Oliver 2010-03-02 21:27:19