重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
记一次鼠标钩子的使用
公司专注于为企业提供网站建设、成都网站制作、微信公众号开发、商城系统网站开发,小程序开发,软件定制制作等一站式互联网企业服务。凭借多年丰富的经验,我们会仔细了解各客户的需求而做出多方面的分析、设计、整合,为客户设计出具风格及创意性的商业解决方案,成都创新互联更提供一系列网站制作和网站推广的服务。惰性啊,好久没写东西了,但是今天这东西太重要,所以决心记下来,后续可以看看。
鼠标钩子(MouseHock),很少使用的一个功能,偶尔要用了也会因为各种涉及操作系统底层的接口让我这种水货避而远之,话又说回来了,兴趣是最好的老师,这次我Get了这个技能,但由于这个功能太过于强大,属于非托管资源,用完请立即释放钩子,否则你QQ回车发送的东西能传到你调试的XXXAPI你信不。。。
顾名思义,围绕着鼠标的操作而进行的,提前附上鼠标的相关Intptr值:
private const int WM_MOUSEMOVE = 0x200;
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_RBUTTONDOWN = 0x204;
private const int WM_MBUTTONDOWN = 0x207;
private const int WM_LBUTTONUP = 0x202;
private const int WM_RBUTTONUP = 0x205;
private const int WM_MBUTTONUP = 0x208;
private const int WM_LBUTTONDBLCLK = 0x203;
private const int WM_RBUTTONDBLCLK = 0x206;
private const int WM_MBUTTONDBLCLK = 0x209; 十六进制的值,注意和十进制之间的转换
钩子源码网上很多就不敲了,使用过程简单说一下:
创建对象
安装钩子
绑定事件
卸载钩子(释放资源)
钩子里有这样一段代码,说下用的时候存在的坑:
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
{
//判断是否是鼠标点击 规避鼠标移动函数
if (wParam.ToString("X2") == "201" || wParam.ToString("X2") == "204")
{
MouseButtons button = MouseButtons.Left;
var e = new MouseEventArgs(button, 1, point.X, point.Y, 0);
MouseClickEvent?.Invoke(this, e);
this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y);
//return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);
}
return default(int);
}
}
注: 标记区域是因为我的任务需求是需要鼠标执行单击操作,而不是千篇一律的将钩子抓取的所有操作都传出来,一方面是资源开销大,一方面是确实不需要,判断的地方写的很Low,直接对比上附的十六进制值务必注意释放钩子!!!