鼠标钩子 详细讲解在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.aihuau.com/a/8104030103/157613.html

更多阅读

猪胰治疗糖尿病 猪胰子

方一猪胰1条,淡菜45--80克。先将淡菜(干品)洗净后用清水浸泡约20分钟,然后放入煲汤,待煮开10分钟后加入猪胰同煲。熟透后调味进服,亦可佐餐。本方为糖尿病人的辅助治疗食品。方二猪胰脏1具,菠菜60克,鸡蛋3个。生将猪胰切片煮熟,再将鸡蛋打

如何删除历史记录? ie如何删除历史记录

如何删除历史记录?每次上网都会留下记录,当我从浏览器中删除历史记录后,“开始”中的“文档”里还有上网的痕迹,又要一一删去,那样怎样用简易的方法使上网不留痕迹??1 自定义删除(即想删除哪条历史记录就删除哪条)在百度搜索网页里的搜索栏

寻枪记 3G寻枪记

系列专题:3G营销观察  近期,中国移动的电子书阅读器广告再次铺天盖地而来,看着广告创意及投放频度,让人不由自主的想起2009新春时的上网本宣传,竟是如此相似。   2009年被业内称为3G元年,可当一年的尘嚣落定、喧哗褪去之后,回首看时,整

南京新百福字 出售百货业务 南京新百转战商业地产

  依托南京核心商圈的商业物业和股东即将注入的商业地产业务,南京新百(600682)决定退出竞争激烈的百货业务,转而做大做强商业地产投资、开发和租售。今日,公司发布了有关主业变更的重大资产重组预案。   该重组预案涉及两部分,一是南

透视香港市场的仙股 透视中国肝药市场新趋势

波澜不惊的2004   1、 传统的大药市场值得关注。   肝药市场是中国公认的大药市场,全世界现有3.5亿慢性乙肝病毒携带者,中国约有1.2亿乙肝患者。综观近年来的乙肝用药市场,各路英雄层出不穷,“速立特”虽遭遇滑铁卢,但是其作为是OT

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