2010-05-27 117 views
3

我想設置跟蹤哪個應用程序處於活動狀態的全局鉤子。如何爲WH_CALLWNDPROCRET設置全局鉤子?

在我的主程序我做foloowing:

HMODULE mod=::GetModuleHandle(L"HookProcDll"); 
HHOOK rslt=(WH_CALLWNDPROCRET,MyCallWndRetProc,mod,0); 

被稱爲MyCallWndRetProc存在於所謂的HookProcDll.dll單獨的DLL的鉤子程序。掛鉤程序正在觀察WM_ACTIVATE消息。

問題是,代碼在我設置掛鉤的行中出現問題,即在我撥打電話::SetWindowsHookEx的行中。然後Windows得到反應遲鈍,我的任務欄消失,我留下了空的桌面。然後我必須重置電腦。

錯在哪裏,爲什麼Windows得不到響應?和 我是否需要在每個進程中注入HookProcDll.dll以設置全局鉤子,我該怎麼做?

+0

我想你在第二行缺少一個函數名稱。而且你沒有發佈最重要的代碼:'SetWindowsHookEx'調用和你的鉤子程序。 – interjay 2010-05-27 22:32:15

+0

我假設HHOOK rslt =(..)應該是HHOOK rslt = SetWindowsHookEx(...); – Michael 2010-05-27 22:38:09

+1

您已經在每個進程中注入DLL。這是問題所在,你會崩潰每個GUI應用程序,包括Windows資源管理器。將其注入到自己的第一個中,以便調試它。 – 2010-05-27 22:51:53

回答

1

這幾乎肯定聽起來像是MyCallWndRetProc中的崩潰錯誤。你指定你的鉤子DLL在每一個窗口進程中被加載,當窗口消息之後調用MyCallWndRetProc時它會崩潰。由於它在每個進程中的每個窗口消息之後都被調用,它最終會在用戶會話中取消顯示UI的每個進程。你甚至不能啓動新的應用程序,因爲你的鉤子程序會立即加載到它們中。

將代碼包含到MyCallWndRetProc中,也許您的DllMain也應該讓我們對發生的事情有所瞭解。

0

這是我的鉤子程序的代碼,並保存在HookProcDll.dll

#include "HookProcDll.h" 
LRESULT CALLBACK MyCallWndRetProc(
    __in int nCode, 
    __in WPARAM wParam, /* whether the msg is sent by the current process */ 
    __in LPARAM lParam /* pointer to CWPRETSTRUCT , which specifies details about the message */ 
) 
{ 
    if(nCode >=0) 
    { 
     CWPRETSTRUCT* retStruct=(CWPRETSTRUCT*)lParam; 
     if(retStruct->message == WM_ACTIVATE) 
     { 

     } 
    } 
    return ::CallNextHookEx(0,nCode,wParam,lParam); 
} 

我HookProcDll.dll沒有明確的DllMain函數.The HookProcDll.dll與Visual Studio的DLL項目取得所以我想它包括DllMain的standrad實現。