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; }
3. Call
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 (); }