今天,有个同事问我,怎样在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( i