.net 的hook 设计_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > .net 的hook 设计

.net 的hook 设计

 2010/12/12 15:04:50  applechong  http://weizhigan.javaeye.com  我要评论(0)
  • 摘要:今天,有个同事问我,怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanagedC或C++写个DLL来实现,可大家都知道,C#是基于.NetFramework的,是managed,怎么实现全局钩子呢?于是开始到网上搜索,好不容易找到一篇,318804-HOWTO:SetaWindowsHookinVisualC#.NET,里面详细的说明了如何使用鼠标钩子捕获鼠标的移动等,可是,它只能在Application里起作用,出了Application就没用了,就是说它还是没有实现全局钩子
  • 标签:.net net 设计

今天,有个同事问我,怎样在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 Framework...”,这可怎么办呢?

  别担心,办法总是有的,经过一番摸索以后,发现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);
发表评论
用户名: 匿名