• c# 全局鼠标事件


    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);
            //卸载钩子
            [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);
        }
    Win32Api

    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;
        }
    MouseHook

    3.调用

    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);
    
            //按下鼠标键触发的事件
            private void mh_MouseDownEvent(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    LeftTag = true;
                    richTextBox1.AppendText("按下了左键
    ");
                }
                if (e.Button == MouseButtons.Right)
                {
                    RightTag = true;
                    richTextBox1.AppendText("按下了右键
    ");
                }
                p1 = e.Location;
            }
    
            //松开鼠标键触发的事件
            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("松开了左键
    ");
                }
                if (e.Button == MouseButtons.Right)
                {
                    richTextBox1.AppendText("松开了右键
    ");
                }
                richTextBox1.AppendText("移动了" + value + "距离
    ");
                RightTag = false;
                LeftTag = false;
                p1 = new Point(0, 0);
                p2 = new Point(0, 0);
            }
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                mh.UnHook();
            }
    Form1

  • 相关阅读:
    asp.net如何实现删除文件的操作? (转)
    开始计算机英语的学习,先把这里当生词本用了。
    CSS Box Model 盒子模型
    生成网站快捷方式
    Microsoft .NET Framework 3.5 sp1离线安装解决方案
    asp.net生成网站快捷方式
    https://mail.google.com/tasks/ig?pli=1
    Sql server DATEDIFF DATEADD
    局域网 跨数据库 访问数据库
    asp.net 生成网站快捷方式
  • 原文地址:https://www.cnblogs.com/margin-gu/p/7083456.html
Copyright © 2020-2023  润新知