鼠标钩子 详细讲解在C#中如何使用鼠标钩子

详细讲解在C#中如何使用鼠标钩子――简介

本文举例介绍如何使用Win32Api创建鼠标钩子。

详细讲解在C#中如何使用鼠标钩子――工具/原料

Visual Studio(本文使用VS2013,其他版本亦可)。

详细讲解在C#中如何使用鼠标钩子――基础知识

详细讲解在C#中如何使用鼠标钩子 1、

使用钩子之前,必须创建钩子,使用函数SetWindowsHookEx,函数原型如下:

HHOOK WINAPI SetWindowsHookEx(

__in int idHook,\钩子类型

__in HOOKPROC lpfn,\回调函数地址

__in HINSTANCE hMod,\实例句柄,钩子所在的实例的句柄

__in DWORD dwThreadId);\线程ID,钩子所监视的线程的线程ID

函数说明:

1、钩子的类型:分两种,全局钩子和局部钩子。全局钩子可以抓取其他进程的消息,分为抓取其他进程中某一特定线程的消息和抓取所有进程的消息两种。而局部钩子只抓取当前进程的消息。

2、 回调函数。当抓取到消息时,操作系统将自动调用该函数处理消息。在C#中要使用委托。

3、实例句柄,对于线程序钩子,参数传NULL;对于系统钩子:参数为钩子DLL的句柄。

4、线程ID:对于全局钩子,该参数为NULL。


详细讲解在C#中如何使用鼠标钩子 2、

钩子函数是回调函数。当钩子捕获到指定的消息后,系统将会自动调用该函数进行处理。注意:钩子函数应当“短小精悍”,不能占用太多的时间,最好是只用来捕获和传递消息,对消息的处理应放在其他地方。函数原型如下:LRESULT WINAPI MyHookProc(int nCode , // 指定是否需要处理该消息WPARAM wParam, // 附加消息wParam

LPARAM lParam // 附加消息lParam

)

注意:在C#中应当使用委托,而且应带在钩子函数的结尾调用CallNextHookEx函数处理下一条消息,函数原型如下:

LRESULT CallNextHookEx(HHOOK hhk, // 钩子句柄int nCode, // nCodeWPARAM wParam, // 附加消息wParam

LPARAM lParam // 附加消息lParam

)


详细讲解在C#中如何使用鼠标钩子 3、

使用完钩子后一定要卸载钩子,否则可能会导致BUG,甚至导致死机。使用函数UnhookWin_

dowsHookEx()卸载钩子即可。函数原形如下:

BOOL UnhookWindowsHookEx(

HHOOK hhk // 要卸载的钩子句柄。)

详细讲解在C#中如何使用鼠标钩子――鼠标钩子实例

详细讲解在C#中如何使用鼠标钩子 1、

启动VS,创建C# WinForm项目,如下:


详细讲解在C#中如何使用鼠标钩子 2、

主窗口Form1布局,如下:


详细讲解在C#中如何使用鼠标钩子 3、

添加新建类Win32Api,该类封装Api函数,代码如下:

public class Win32Api

{

[StructLayout(LayoutKind.Sequential)]

public class POINT

{ public int x;

public int y;

}

[StructLayout(LayoutKind.Sequential)]

public class MouseHookStruct

{

public POINT pt;

public int hwnd;

public int wHitTestCode;

public int dwExtraInfo;

}

public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

//安装钩子

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

//卸载钩子

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern bool UnhookWindowsHookEx(int idHook);

//调用下一个钩子

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

}


详细讲解在C#中如何使用鼠标钩子 4、

添加新建类MouseHook,该类封装对鼠标钩子的操作,代码如下:

public class MouseHook

{

private Point point;

private Point Point

{

get { return point; }

set

{

if (point != value)

{

point = value;

if (MouseMoveEvent != null)

{

var e = new MouseEventArgs(MouseButtons.None, 0, point.X, point.Y, 0);

MouseMoveEvent(this, e);

}

}

}

}

private int hHook;

public const int WH_MOUSE_LL = 14;

public Win32Api.HookProc hProc;

public MouseHook() { this.Point = new Point(); }

public int SetHook()

{

鼠标钩子 详细讲解在C#中如何使用鼠标钩子

hProc = new Win32Api.HookProc(MouseHookProc);

hHook = Win32Api.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero, 0);

return hHook;

}

public void UnHook()

{

Win32Api.UnhookWindowsHookEx(hHook);

}

private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)

{

Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct));

if (nCode < 0)

{

return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

}

else

{

this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y);

return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

}

}

//委托+事件(把钩到的消息封装为事件,由调用者处理)

public delegate void MouseMoveHandler(object sender, MouseEventArgs e);

public event MouseMoveHandler MouseMoveEvent;

}


详细讲解在C#中如何使用鼠标钩子 5、

然后,在Form1中添加代码,如下:

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

MouseHook mh;

private void Form1_Load(object sender, EventArgs e)

{

mh= new MouseHook();

mh.SetHook();

mh.MouseMoveEvent += mh_MouseMoveEvent;

}

void mh_MouseMoveEvent(object sender, MouseEventArgs e)

{

int x = e.Location.X;

int y = e.Location.Y;

label1.Text = string.Format("当前鼠标位置为:({0},{1})",x,y);

}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)

{

mh.UnHook();

}

}


详细讲解在C#中如何使用鼠标钩子 6、

完成后,调试运行,结果如下:

详细讲解在C#中如何使用鼠标钩子_鼠标钩子

详细讲解在C#中如何使用鼠标钩子――注意事项

钩子使用后必须卸载。

钩子回调函数要足够简单。

通过事件可以把对消息的处理方法放在类的使用时。

  

爱华网本文地址 » http://www.413yy.cn/a/8104030103/157613.html

更多阅读

东莞市博物馆 东莞旅游景点大全

元青花瓷元代随着国内外贸易的发展需要,中国瓷业较宋代又有更大的进步,景德镇窑成功的烧制出青花瓷器。青花瓷的普遍出现和趋于成熟,产销兴旺,元人蒋祁著《陶计略》(记元代景德镇瓷业情况的唯一书籍)中记述:“窑火既歇,商争取售,而上者择焉,谓

佛教名称中英文对照 中英文食材名称对照

DDB Index for English TermsEnglish Termsabbatial acolyte 室的侍者abbot 和尚, 方丈abbot's robe 红衣accounts officer 库头acolyte 侍者ancestor's hall 祖堂apartment for retired monks 闲寮房arrival for installation 晋

男友找女人同居,好变态_赵 我的同居男友

【一个女大学生的诉说。她觉得男友不陪她,不让男友碰她,遇到不顺眼事就发火,爱发脾气,让男友感到压力,感到不平等,感到受到了打击,所以,她男友宁可找一个比她丑、并且结过婚的女人,原因就是那个女人对他好,在一起不会有压力。最终,她懂得了“女

实木家具保养用什么油 实木家具的保养方法

实木家具的保养方法&#160;&#160; &#160; &#160;&#160; 1、注意家具表面的清洁维护。定时用纯棉干软布轻轻拭去表面浮尘,每隔一段时间,用拧干水分的湿棉丝将家具犄角旮旯处的积尘细细揩净,再用洁净的干软细棉布揩;2、避免用酒精、汽油

声明:《鼠标钩子 详细讲解在C#中如何使用鼠标钩子》为网友帅比气质难自弃分享!如侵犯到您的合法权益请联系我们删除