c # global mouse events

c # global mouse events

1.Win32Api

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);
        // Uninstall hook 
        [DllImport ("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
        public static extern bool UnhookWindowsHookEx (int idHook); 
        // Call the next hook 
        [DllImport ("user32.dll" , CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
        public static extern int CallNextHookEx (int idHook, int nCode, IntPtr wParam, IntPtr lParam); 
    }

2.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;
        private static int hMouseHook = 0;
        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;

        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
            {
                MouseButtons button = MouseButtons.None;
                int clickCount = 0;
                switch ((Int32)wParam)
                {
                    case WM_LBUTTONDOWN:
                        button = MouseButtons.Left;
                        clickCount = 1;
                        MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));
                        break;
                    case WM_RBUTTONDOWN:
                        button = MouseButtons.Right;
                        clickCount = 1;
                        MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));
                        break;
                    case WM_MBUTTONDOWN:
                        button = MouseButtons.Middle;
                        clickCount = 1;
                        MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));
                        break;
                    case WM_LBUTTONUP:
                        button = MouseButtons.Left;
                        clickCount = 1;
                        MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));
                        break;
                    case WM_RBUTTONUP:
                        button = MouseButtons.Right;
                        clickCount = 1;
                        MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));
                        break;
                    case WM_MBUTTONUP:
                        button = MouseButtons.Middle;
                        clickCount = 1;
                        MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));
                        break;
                }

                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;

        public delegate void MouseDownHandler(object sender, MouseEventArgs e);
        public event MouseDownHandler MouseDownEvent;

        public delegate void MouseUpHandler(object sender, MouseEventArgs e);
        public event MouseUpHandler MouseUpEvent;
    }

Copy code

3. Call

Copy code

MouseHook mh; 

        private void Form1_Load (object sender, EventArgs e) 
        { 
            mh = new MouseHook (); 
            mh.SetHook (); 
            mh.MouseDownEvent + = mh_MouseDownEvent; 
            mh.MouseUpEvent + = mh_MouseUpEvent; 
        } 

        bool LeftTag = false; 
        bool RightTag = false; 
        Point p1 = new Point (0,0); 
        Point p2 = new Point (0, 0); 

        // Event triggered by pressing the mouse button 
        private void mh_MouseDownEvent (object sender, MouseEventArgs e) 
        { 
            if (e.Button = = MouseButtons.Left) 
            { 
                LeftTag = true;
                richTextBox1.AppendText ("Left button pressed \ n");
            } 
            if (e.Button == MouseButtons.Right) 
            { 
                RightTag = true; 
                richTextBox1.AppendText ("Right clicked \ n"); 
            } 
            p1 = e.Location; 
        } 

        // Event triggered by releasing the mouse button 
        private void mh_MouseUpEvent (object sender, MouseEventArgs e) 
        { 
            p2 = e.Location; 
            double value = Math.Sqrt (Math.Abs ​​(p1.X-p2.X) * Math.Abs ​​(p1.X-p2.X) + Math. Abs (p1.Y-p2.Y) * Math.Abs ​​(p1.Y-p2.Y)); 
            // if (LeftTag && RightTag && value> 100)  
            // {
            // MessageBox.Show ("ok"); 
            // } 
            if (e.Button == MouseButtons.Left)
            { 
                richTextBox1.AppendText ("Left button released \ n"); 
            } 
            if (e.Button == MouseButtons.Right) 
            { 
                richTextBox1.AppendText ("Right button released \ n"); 
            } 
            richTextBox1.AppendText ("Move "+ Value +" distance \ n "); 
            RightTag = false; 
            LeftTag = false; 
            p1 = new Point (0, 0); 
            p2 = new Point (0, 0); 
        } 
        private void Form1_FormClosed (object sender, FormClosedEventArgs e ) 
        { 
            mh.UnHook (); 
        }

Copy code

Published 17 original articles · Like 228 · Visit 330,000+

Guess you like

Origin blog.csdn.net/cxu123321/article/details/105490016