| 网站首页 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛 |
 
| 技术教程首页 | 开发语言 | WEB开发 | .NET技术 | 数据库 | 操作系统 | 网页制作 |
 
 

 

您现在的位置: 编程中国 >> 技术教程 >> .NET技术 >> C# >> C#教程 >> 正文
  ►  C#+低级Windows API钩子拦截键盘输入
C#+低级Windows API钩子拦截键盘输入
作者:朱先忠编译    阅读人次:……    文章来源:天极开发    发布时间:2007-8-13    网友评论()条
 

 

  八. 把击键传递到下一个应用程序

  一个良好的键盘钩子回调方法应该以调用CallNextHookEx函数并且返回它的结果结束。这可以确保其它应用程序能够有机会处理针对于它们的击键。

  然而,KeyboardHook类的主要功能在于,阻止击键被传播到任何其它更多的应用程序。因此它无论在何时处理一次击键,HookCallback都将返回一个哑值:

return (System.IntPtr)1;

  另一方面,它确实调用CallNextHookEx-如果它不处理该事件,或如果重载的构造器中的使用KeyboardHook传递的参数允许某些组合键通过。

  CallNextHookEx被启用-通过从user32.dll导入该函数,如下列代码所示:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
IntPtr wParam, ref KeyInfoStruct lParam);

  然后,被导入的方法被HookCallMethod所调用,这可以确保所有的通过钩子接收到的参数被继续传递到下一个应用程序中:

CallNextHookEx(hookID, nCode, wParam, ref lParam);

  如前面所提及,如果在lParam中的flags是不相关的,那么可以修改导入的CallNextHookEx的签名以把lParam定义为System.IntPtr。

  九. 移去钩子

  处理钩子的最后一步是使用从user32.dll中导入的UnhookWindowsHookEx函数移去它(当破坏KeyboardHook类的实例时),如下所示:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);

  既然KeyboardHook实现IDisposable,那么这可以在Dispose方法中完成。

public void Dispose()
{
 UnhookWindowsHookEx(hookID);
}

  hookID是构造器在调用SetWindowsHookEx所返回的id。这将从钩子链中删除应用程序。

上一页  [1] [2] [3] [4] 

 

 
文章录入:编辑01    责任编辑:编辑01 
  • 上一篇文章:

  • 下一篇文章:

  •  
    相关文章
    原创地带
    24小时热门帖子