2010-03-02 64 views
1

我想學習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時忘記鉤子一樣()函數。

任何人都可以照亮這個問題嗎?我一直拉着我的頭髮好幾天試圖讓它工作,但我沒有運氣。

回答

1

我懷疑這是因爲您有控制檯應用程序,系統不會發送有關控制檯窗口的激活,創建,移動等的通知。嘗試使其正常的Windows應用程序。

+0

工作,謝謝。它有點煩人,因爲我的程序現在已經從一個很酷的4行到100個初始化所有的窗口的東西,但我很高興它的工作原理。 – Oliver 2010-03-02 21:27:19