您的位置:首页 > 其它

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

2011-07-06 14:38 525 查看
刚学的钩子,赶紧把东西记下来免得以后遗忘。

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐