网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > DotNet > VC.NET > 深入探讨.NET中的钩子技术  

深入探讨.NET中的钩子技术

2006-09-08  作者:网管整理  来源:bitscn  点评 投稿 收藏

    一、 介绍
  
    本文将讨论在.NET应用程序中全局系统钩子的使用。为此,我开发了一个可重用的类库并创建一个相应的示例程序(见下图)。
  
  
  
    你可能注意到另外的关于使用系统钩子的文章。本文与之类似但是有重要的差别。这篇文章将讨论在.NET中使用全局系统钩子,而其它文章仅讨论本地系统钩子。这些思想是类似的,但是实现要求是不同的。
  
    二、 背景
  
    如果你对Windows系统钩子的概念不熟悉,让我作一下简短的描述:
  
    ·一个系统钩子允许你插入一个回调函数-它拦截某些Windows消息(例如,鼠标相联系的消息)。
  
    ·一个本地系统钩子是一个系统钩子-它仅在指定的消息由一个单一线程处理时被调用。
  
    ·一个全局系统钩子是一个系统钩子-它当指定的消息被任何应用程序在整个系统上所处理时被调用。
  已有若干好文章来介绍系统钩子概念。在此,不是为了重新收集这些介绍性的信息,我只是简单地请读者参考下面有关系统钩子的一些背景资料文章。如果你对系统钩子概念很熟悉,那么你能够从本文中得到你能够得到的任何东西。 网管朋友网www_bitscn_net
  
    ·关于MSDN库中的钩子知识。
  
    ·Dino Esposito的《Cutting Edge-Windows Hooks in the .NET Framework》。
  
    ·Don Kackman的《在C#中应用钩子》。
  
    本文中我们要讨论的是扩展这个信息来创建一个全局系统钩子-它能被.NET类所使用。我们将用C#和一个DLL和非托管C++来开发一个类库-它们一起将完成这个目标。
  
    三、 使用代码
  
    在我们深入开发这个库之前,让我们快速看一下我们的目标。在本文中,我们将开发一个类库-它安装全局系统钩子并且暴露这些由钩子处理的事件,作为我们的钩子类的一个.NET事件。为了说明这个系统钩子类的用法,我们将在一个用C#编写的Windows表单应用程序中创建一个鼠标事件钩子和一个键盘事件钩子。
  
    这些类库能用于创建任何类型的系统钩子,其中有两个预编译的钩子-MouseHook和KeyboardHook。我们也已经包含了这些类的特定版本,分别称为MouseHookExt和KeyboardHookExt。根据这些类所设置的模型,你能容易构建系统钩子-针对Win32 API中任何15种钩子事件类型中的任何一种。另外,这个完整的类库中还有一个编译的HTML帮助文件-它把这些类归档化。请确信你看了这个帮助文件-如果你决定在你的应用程序中使用这个库的话。

网管u家u.bitsCN.com


  
    MouseHook类的用法和生命周期相当简单。首先,我们创建MouseHook类的一个实例。
  
  mouseHook = new MouseHook();//mouseHook是一个成员变量
  
    接下来,我们把MouseEvent事件绑定到一个类层次的方法上。
  
  mouseHook.MouseEvent+=new MouseHook.MouseEventHandler(mouseHook_MouseEvent);
  // ...
  private void mouseHook_MouseEvent(MouseEvents mEvent, int x, int y){
   string msg =string.Format("鼠标事件:{0}:({1},{2}).",mEvent.ToString(),x,y);
   AddText(msg);//增加消息到文本框
  }
  
    为开始收到鼠标事件,简单地安装下面的钩子即可。
  
  mouseHook.InstallHook();
  
    为停止接收事件,只需简单地卸载这个钩子。
  
  mouseHook.UninstallHook();
  
    你也可以调用Dispose来卸载这个钩子。 网管u家u.bitscn@com
  
    在你的应用程序退出时,卸载这个钩子是很重要的。让系统钩子一直安装着将减慢系统中的所有的应用程序的消息处理。它甚至能够使一个或多个进程变得很不稳定。因此,请确保在你使用完钩子时一定要移去你的系统钩子。我们确定在我们的示例应用程序会移去该系统钩子-通过在Form的Dispose方法中添加一个Dispose调用。
  
  protected override void Dispose(bool disposing) {
   if (disposing) {
    if (mouseHook != null) {
     mouseHook.Dispose();
     mouseHook = null;
    }
    // ...
   }
  }
  
  
    使用该类库的情况就是如此。该类库中有两个系统钩子类并且相当容易扩充。
网管u家u.bitscn@com

 上一篇:QQ尾巴病毒的Visual C++实现探讨   下一篇:VC预处理指令与宏定义的妙用
深入探讨.NET中的钩子技术 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: