今天,有个同事问我,怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanaged C 或C++写个DLL 来实现,可大家都知道,C#是基于.Net Framework 的,是managed,怎么实现全局钩子呢?于是开始到网上搜索,好不容易找到一篇,318804 - HOW TO: Set a Windows Hook in Visual C# .NET,里面详细的说明了如何使用鼠标钩子捕获鼠标的移动等,可是,它只能在Application 里起作用,出了Application 就没用了,就是说它还是没有实现全局钩子,而且文章结尾处说:“Global Hooks are not supported in the .NET Framew ork...”,这可怎么办呢? 别担心,办法总是有的,经过一番摸索以后,发现WH_KEYBORAD_LL 和WH_MOUSE_LL 这两个low-level 的hook 可以被安装成全局的,这就好办了,我们不妨用这两个low-level 的hook 替换掉WH_KEYBORAD 和WH_MOUSE,于是开始测试。结果成功了,在C#里实现了全局钩子。 我们来看一下主要代码段。 首先倒入所需要的windows 函数,主要有三个,SetWindowsHookEX 用来安装钩子,UnhookWindowsHookEX 用来卸载钩子以及 CallNextHookEX 用来将 hook 信息传递到链表中下一个hook 处理过程。 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)] private static extern int SetWindowsHookEx( int idHook, HookProc lpfn, IntPtr hMod, int dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)] private static extern int UnhookWindowsHookEx(int idHook); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] private static extern int CallNextHookEx( int idHook, int nCode, int wParam, IntPtr lParam); 下面是有关这两个 low-level hook 在 Winuser.h 中的定义: /// /// Windows NT/2000/XP: Installs a hook procedure that monitors low-level mouse input events. /// private const int WH_MOUSE_LL = 14; /// /// Windows NT/2000/XP: Installs a hook procedure that monitors low-level keyboard input even...