zoukankan      html  css  js  c++  java
  • C# winform 获取鼠标点击位置

    说明:该篇随笔的代码内容并非出自本人,是在其他网站搜寻的,出处已经不记得了,本次随笔只为记录,目的帮助自己,帮助他人。

    实现的原理也不做多的赘述,直接上代码。

    第一个类是需要用到的Windows 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);
        }
    Windows API

    第二个类是用于监控鼠标移动,鼠标点击的

    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;
            private const int WM_LBUTTONDOWN = 0x201;
            private const int WM_RBUTTONDOWN = 0x204;
            public const int WH_MOUSE_LL = 14;
            public Win32Api.HookProc hProc;
            public MouseHook()
            {
                this.Point = new Point();
            }
            public int SetHook()
            {
                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
                {
                    if (MouseClickEvent != null)
                    {
                        MouseButtons button = MouseButtons.None;
                        int clickCount = 0;
                        switch ((Int32)wParam)
                        {
                            case WM_LBUTTONDOWN:
                                button = MouseButtons.Left;
                                clickCount = 1;
                                break;
                            case WM_RBUTTONDOWN:
                                button = MouseButtons.Right;
                                clickCount = 1;
                                break;
                        }
    
                        var e = new MouseEventArgs(button, clickCount, point.X, point.Y, 0);
                        MouseClickEvent(this, e);
                    }
                    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;
    
            public delegate void MouseClickHandler(object sender, MouseEventArgs e);
            public event MouseClickHandler MouseClickEvent;
        }
    MouseHook

    最后直接在窗体中调用重写的事件即可

    public getLocationForm()
            {
                InitializeComponent();
            }
    
            MouseHook mh;
            private void getLocationForm_Load(object sender, EventArgs e)
            {
                mh = new MouseHook();
                mh.SetHook();
                mh.MouseMoveEvent += mh_MouseMoveEvent;
                mh.MouseClickEvent += mh_MouseClickEvent;
    
            }
    
            private void mh_MouseClickEvent(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Right)
                {
                    //MessageBox.Show(e.X + "-" + e.Y);
    
                    textBox1.Text = e.X.ToString();
                    textBox2.Text = e.Y.ToString();
                }
            }
    
            private void mh_MouseMoveEvent(object sender, MouseEventArgs e)
            {
                int x = e.Location.X;
                int y = e.Location.Y;
                textBox1.Text = x + "";
                textBox2.Text = y + "";
            }
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                mh.UnHook();
            }
    getLocationForm

  • 相关阅读:
    Vue demo
    netcore使用IOptions
    CS0656 缺少编译器要求的成员“Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create”
    vs删除空白行 注释
    RabbitMQ入门
    EF 大数据量批量处理
    常用链接字符串
    DEA使用git提交代码时,点了commit之后卡死在performing code analysis部分,或者performing code analysis结束后没有进入下一步操作。
    Ubuntu16.04安装MySQL5.7
    ubuntu16.04源码编译安装nginx1.14.2
  • 原文地址:https://www.cnblogs.com/ocean-wang/p/11855750.html
Copyright © 2011-2022 走看看