使用钩子之前,必须创建钩子,使用函数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 // 要卸载的钩子句柄。 )