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);
- }
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;
- }
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("按下了左键\n");
- }
- if (e.Button == MouseButtons.Right)
- {
- RightTag = true;
- richTextBox1.AppendText("按下了右键\n");
- }
- 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("松开了左键\n");
- }
- if (e.Button == MouseButtons.Right)
- {
- richTextBox1.AppendText("松开了右键\n");
- }
- richTextBox1.AppendText("移动了" + value + "距离\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();
- }
- 随机文章
- 热门文章
- 热评文章