温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#鼠标钩子   带你走出Form的区域限制

发布时间:2020-07-23 09:08:29 来源:网络 阅读:2830 作者:tb612443 栏目:软件技术

记一次鼠标钩子的使用

       惰性啊,好久没写东西了,但是今天这东西太重要,所以决心记下来,后续可以看看。

       鼠标钩子(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;  十六进制的值,注意和十进制之间的转换


  1. 钩子源码网上很多就不敲了,使用过程简单说一下:

  2. 创建对象

  3. 安装钩子

  4. 绑定事件

  5. 卸载钩子(释放资源)

钩子里有这样一段代码,说下用的时候存在的坑:

        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,直接对比上附的十六进制值 务必注意释放钩子!!!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

fo bs
AI