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

13 篇文章 0 订阅
1 篇文章 0 订阅

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


1.钩子的装卸


环境

Visual Studio 2010 + C# + Win7


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

//首先需要定义几个全局变量

  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.csdn.net/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);


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值