使用鈎子之前,必須建立鈎子,使用函數SetWindowsHookEx,函數原型如下:
HHOOK WINAPI SetWindowsHookEx(__in int idHook, \\鈎子類型
__in HOOKPROC lpfn, \\回調函數位址
__in HINSTANCE hMod, \\執行個體句柄,鈎子所在的執行個體的句柄
__in DWORD dwThreadId); \\線程ID,鈎子所監視的線程的線程ID
)
函數說明:
1、鈎子的類型:分兩種,全局鈎子和局部鈎子。全局鈎子可以抓取其他程序的消息,分為抓取其他程序中某一特定線程的消息和抓取所有程序的消息兩種。而局部鈎子隻抓取目前程序的消息。
2、 回調函數。當抓取到消息時,作業系統将自動調用該函數處理消息。在C#中要使用委托。
3、執行個體句柄,對于線程式鈎子,參數傳NULL;對于系統鈎子:參數為鈎子DLL的句柄。
4、線程ID:對于全局鈎子,該參數為NULL。
鈎子函數是回調函數。當鈎子捕獲到指定的消息後,系統将會自動調用該函數進行處理。
注意:鈎子函數應當“短小精悍”,不能占用太多的時間,最好是隻用來捕獲和傳遞消息,對消息的處理應放在其他地方。
函數原型如下:
LRESULT WINAPI MyHookProc( int nCode , // 指定是否需要處理該消息
WPARAM wParam, // 附加消息
wParam LPARAM lParam // 附加消息lParam
)
注意:在C#中應當使用委托,而且應帶在鈎子函數的結尾調用CallNextHookEx函數處理下一條消息,函數原型如下:
LRESULT CallNextHookEx( HHOOK hhk, // 鈎子句柄
int nCode, //
nCode WPARAM wParam, // 附加消息wParam
LPARAM lParam // 附加消息lParam
)
使用完鈎子後一定要解除安裝鈎子,否則可能會導緻BUG,甚至導緻當機。使用函數UnhookWin_dowsHookEx()解除安裝鈎子即可。函數原形如下:
BOOL UnhookWindowsHookEx(HHOOK hhk // 要解除安裝的鈎子句柄。 )