记一次鼠标钩子的使用
惰性啊,好久没写东西了,但是今天这东西太重要,所以决心记下来,后续可以看看。
鼠标钩子(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,直接对比上附的十六进制值 务必注意释放钩子!!!
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/195122.html