[Hook]个人学习笔记——挂个简单的钩子(全局鼠标Hook)(.NET) .

本文介绍如何使用C#实现全局鼠标钩子,包括钩子的安装与卸载过程。通过实例展示了如何监听鼠标点击事件,并提供了详细的代码示例。

刚学的钩子,赶紧把东西记下来免得以后遗忘。


1.钩子的装卸


环境

Visual Studio 2010 + C# + Win7


/*---这里开始---*/

  1. //首先需要定义几个全局变量   
  2.   
  3.   private IntPtr hhook;//全局钩子的句柄.尚未赋值。   
  4.   
  5.        private const int WH_MOUSE_LL = 14;//参数(这些具体的参数可在msdn中查找,亦可以在winuser.h中找到)   
  6.   
  7.        //... ...一些将会用到的参数   
  8.   
  9.    //导入几个将会用到的函数   
  10.         [DllImport("user32.dll")]  
  11.         static extern IntPtr <STRONG>SetWindowsHookEx</STRONG>(int idHook, MouseHookProc callback, IntPtr hInstance, uint threadId);//挂钩子用的   
  12.   
  13.   
  14.         [DllImport("user32.dll")]  
  15.         static extern bool UnhookWindowsHookEx(IntPtr hInstance);//卸载钩子   
  16.   
  17.          
  18.   
  19.         [DllImport("user32.dll")]  
  20.         static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);//钩到目标之后(进行处理之后)将目标放走,让它继续它的生活   
  21.   
  22.   
  23.   //定义一个委托(处理钩子用的,回调函数的原型)   
  24.   private delegate int MouseHookProc(int nCode, int wParam, IntPtr lParam);  
  25.   
  26.    //开始   
  27.         public hook()//构造函数   
  28.         {  
  29.   
  30.     //安装钩子,记得要在不用的时候将钩子卸载掉   
  31.             this.hhook = SetWindowsHookEx(WH_MOUSE_LL, HookProc, IntPtr.Zero, 0);//给钩子句柄赋值。(private const int WH_MOUSE_LL = 14;)   
  32.   
  33.        /*四个参数的说明 
  34.  
  35.             /// <param name="idHook">The id of the event you want to hook</param> 
  36.  
  37.             /// <param name="callback">The callback.</param> 
  38.  
  39.             /// <param name="hInstance">The handle you want to attach the event to, can be null</param> 
  40.  
  41.             /// <param name="threadId">The thread you want to attach the event to, can be null</param> 
  42.  
  43.        */  
  44.   
  45.        //第一个参数:定义钩的对象:我设定的对象是——鼠标底层消息   
  46.   
  47.        //第二个参数:钩中目标之后的回调函数,简而言之就是对沟到的消息进行具体处理的用户编写的函数   
  48.   
  49.        //第三个参数:??这个我有些疑问,我个人认为是目标窗体的句柄。但是实际好像要比这个更抽象一些   
  50.   
  51.   }  
  52.   
  53.         ~hook()  
  54.         {//卸载钩子   
  55.   
  56.             UnhookWindowsHookEx(hhook);  
  57.         }  
  58.   
  59.   private int HookProc(int nCode, int wParam, IntPtr lParam)//钩子的回调函数(实际处理钩子的函数)   
  60.   
  61.         {  
  62.             if (nCode >= 0))//   
  63.             {  
  64.   
  65.     switch (wParam)  
  66.                 {  
  67.                     case WM_RBUTTONDOWN://右键按下 ( public const int WM_RBUTTONDOWN = 0x204;)   
  68.                             MessageBox.Show("R_B_Down");  
  69.                             break;  
  70.   
  71.                     case WM_RBUTTONUP://右键释放   (public const int WM_RBUTTONUP = 0x205;)   
  72.   
  73.        ... ...  
  74.   
  75.        break;  
  76.   
  77.      ... ...  
  78.   
  79.       //call next hook               
  80.               return CallNextHookEx(hhook, nCode, wParam, lParam);//将钩子放回大自然,继续过他正常的生活   
  81.   
  82.       }//switch   
  83.   
  84.   }  
//首先需要定义几个全局变量

  private IntPtr hhook;//全局钩子的句柄.尚未赋值。

       private const int WH_MOUSE_LL = 14;//参数(这些具体的参数可在msdn中查找,亦可以在winuser.h中找到)

       //... ...一些将会用到的参数

   //导入几个将会用到的函数
        [DllImport("user32.dll")]
        static extern IntPtr SetWindowsHookEx(int idHook, MouseHookProc callback, IntPtr hInstance, uint threadId);//挂钩子用的


        [DllImport("user32.dll")]
        static extern bool UnhookWindowsHookEx(IntPtr hInstance);//卸载钩子

       

        [DllImport("user32.dll")]
        static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);//钩到目标之后(进行处理之后)将目标放走,让它继续它的生活


  //定义一个委托(处理钩子用的,回调函数的原型)
  private delegate int MouseHookProc(int nCode, int wParam, IntPtr lParam);

   //开始
        public hook()//构造函数
        {

    //安装钩子,记得要在不用的时候将钩子卸载掉
            this.hhook = SetWindowsHookEx(WH_MOUSE_LL, HookProc, IntPtr.Zero, 0);//给钩子句柄赋值。(private const int WH_MOUSE_LL = 14;)

       /*四个参数的说明

            /// <param name="idHook">The id of the event you want to hook</param>

            /// <param name="callback">The callback.</param>

            /// <param name="hInstance">The handle you want to attach the event to, can be null</param>

            /// <param name="threadId">The thread you want to attach the event to, can be null</param>

       */

       //第一个参数:定义钩的对象:我设定的对象是——鼠标底层消息

       //第二个参数:钩中目标之后的回调函数,简而言之就是对沟到的消息进行具体处理的用户编写的函数

       //第三个参数:??这个我有些疑问,我个人认为是目标窗体的句柄。但是实际好像要比这个更抽象一些

  }

        ~hook()
        {//卸载钩子

            UnhookWindowsHookEx(hhook);
        }

  private int HookProc(int nCode, int wParam, IntPtr lParam)//钩子的回调函数(实际处理钩子的函数)

        {
            if (nCode >= 0))//
            {

    switch (wParam)
                {
                    case WM_RBUTTONDOWN://右键按下 ( public const int WM_RBUTTONDOWN = 0x204;)
                            MessageBox.Show("R_B_Down");
                            break;

                    case WM_RBUTTONUP://右键释放   (public const int WM_RBUTTONUP = 0x205;)

       ... ...

       break;

     ... ...

      //call next hook            
              return CallNextHookEx(hhook, nCode, wParam, lParam);//将钩子放回大自然,继续过他正常的生活

      }//switch

  }



2.总的来说

挂个普通的全局钩子总共只要走四步


(1)声明(导入)一些将会用到的函数,注意导入SetWindowsHookEx(...)时需要一个定义一个委托(回调函数的原型)本例中的MouseHookProc


(2)声明一个全局句柄,用来保存将来的钩子——private IntPtr hhook;


(3)定义一个处理钩到目标的函数——本例中的HookProc(...)


(4)在需要钩子时,安装钩子——this.hhook = SetWindowsHookEx(WH_MOUSE_LL, HookProc, IntPtr.Zero, 0);


仅此而已,但是这里只是说明了如何挂上一个最简单的全局鼠标钩子,关于钩子更全面的了解,可以参看FellHo先生的文章 http://blog.youkuaiyun.com/MaybeHelios/archive/2007/06/21/1660709.aspx




3.其他杂七杂八的笔记

//--

Handle    -   IntPtr

lpcStr    -   string来代替

lpStr    -   StringBuilder

DWord...  -   Int32


//--

(1)ShowWindow(GetForegroundWindow(), SW_MINIMIZE);//最小化当前窗口


(2)PostMessage(handle, WM_CLOSE , IntPtr.Zero, IntPtr.Zero);//发送关闭应用程序消息 WM_CLOSE=16


(3)GetForegroundWindow();//获得活动窗口的句柄


(4) GetWindowText(...)//获取窗口标题(Caption)

[DllImport( "User32.dll ")]
static   extern   int   GetWindowText(IntPtr   handle,StringBuilder  
text,int   MaxLen);

调用
StringBuilder   text   =   new   StringBuilder(c);
GetWindowText(handle,text,text.Capacity);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值