详细讲解在C#中如何使用鼠标钩子

详细讲解在C#中如何使用鼠标钩子

基础知识

使用钩子之前,必须创建钩子,使用函数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, // 附加消息wParamLPARAM lParam // 附加消息lParam)注意:在C#中应当使用委托,而且应带在钩子函数的结尾调用CallNextHookEx函数处理下一条消息,函数原型如下:LRESULT CallNextHookEx(HHOOK hhk, // 钩子句柄int nCode, // nCodeWPARAM wParam, // 附加消息wParamLPARAM lParam // 附加消息lParam)

使用完钩子后一定要卸载钩子,否则可能会导致BUG,甚至导致死机。使用函数UnhookWin_dowsHookEx()卸载钩子即可。函数原形如下:BOOL UnhookWindowsHookEx(HHOOK hhk // 要卸载的钩子句柄。)

鼠标钩子实例

启动VS,创建C# WinForm项目,如下:

主窗口Form1布局,如下:

添加新建类Win32Api,该类封装Api函数,代码如下: public class Win32Api { [StructLayout(LayoutKind.Sequential)] public class POINT { public int x; public int y; } [StructLayout(LayoutKind.Sequential)] public class Mous