C#進行單擊操作、單擊位置記錄、捕獲全域性左右鍵單擊事件
阿新 • • 發佈:2018-11-16
自己封裝了AClick.cs和Win32Api.cs兩個類,下面有原始碼,直接呼叫即可
原始碼地址:C#單擊操作、位置記錄、捕獲單擊事件原始碼
效果圖:
1.單擊操作
new AClick().AutoClick(50, 50);//在50,50座標處單擊一次
2.捕獲全域性左右鍵單擊事件和單擊位置記錄
MouseHook mh; private void btnbuhuo_Click(object sender, EventArgs e)//進行單擊事件繫結 { mh = new MouseHook(); mh.SetHook(); mh.MouseDownEvent += mh_MouseDownEvent; mh.MouseUpEvent += mh_MouseUpEvent; } //按下滑鼠鍵觸發的事件 private void mh_MouseDownEvent(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { richTextBox1.AppendText("按下了左鍵\n"); } if (e.Button == MouseButtons.Right) { 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 (e.Button == MouseButtons.Left) { richTextBox1.AppendText("鬆開了左鍵\n"); mh.UnHook(); } if (e.Button == MouseButtons.Right) { richTextBox1.AppendText("鬆開了右鍵\n"); } richTextBox1.AppendText("移動了" + value + "距離\n"); p1 = new Point(0, 0); p2 = new Point(0, 0); }
3.AClick類
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace 全域性滑鼠單擊事件 { public class AClick { [DllImport("User32")] public extern static void mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo); [DllImport("User32")] public extern static void SetCursorPos(int x, int y); [DllImport("User32")] public extern static bool GetCursorPos(out POINT p); [StructLayout(LayoutKind.Sequential)] public struct POINT { public int X; public int Y; } public enum MouseEventFlags { Move = 0x0001, LeftDown = 0x0002, LeftUp = 0x0004, RightDown = 0x0008, RightUp = 0x0010, MiddleDown = 0x0020, MiddleUp = 0x0040, Wheel = 0x0800, Absolute = 0x8000 } public void AutoClick(int x, int y) { POINT p = new POINT(); GetCursorPos(out p); try { SetCursorPos(x, y); mouse_event((int)(MouseEventFlags.LeftDown | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero); mouse_event((int)(MouseEventFlags.LeftUp | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero); } finally { SetCursorPos(p.X, p.Y); } } public XYPoint GetClick() { POINT p = new POINT(); GetCursorPos(out p); SetCursorPos(p.X, p.Y); XYPoint xy = new XYPoint(); xy.X = p.X; xy.Y = p.Y; return xy; } } public class XYPoint { public int X; public int Y; } }
4.Win32Api類
using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace 全域性滑鼠單擊事件 { 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); } 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; } }