C# 模拟鼠标操作类
using System; using System.Drawing; using System.Runtime.InteropServices; using System.Security.Permissions; using System.Windows.Forms; namespace Vicky.Helpers { /// <summary> /// 模拟鼠标点击 /// </summary> [HostProtection(SecurityAction.LinkDemand, Resources = HostProtectionResource.ExternalProcessMgmt)] public static class Mouse { #region 鼠标操作函数 [DllImport("user32.dll")] private static extern void mouse_event(MouseEvent flags, int dx, int dy, uint data, UIntPtr extraInfo); /// <summary> /// 连续两次鼠标单击之间会被处理成双击事件的间隔时间。 /// </summary> /// <returns>以毫秒表示的双击时间</returns> [DllImport("user32.dll", EntryPoint = "GetDoubleClickTime")] public static extern int GetDoubleClickTime();/// <summary> /// 把光标移到屏幕的指定位置。如果新位置不在由 ClipCursor函数设置的屏幕矩形区域之内,则系统自动调整坐标,使得光标在矩形之内。 /// </summary> /// <param name="x">指定光标的新的X坐标,以屏幕坐标表示。</param> /// <param name="y">指定光标的新的Y坐标,以屏幕坐标表示。</param> /// <returns>如果成功,返回非零值;如果失败,返回值是零</returns> [DllImport("user32.dll")] public static extern int SetCursorPos(int x, int y); [Flags] private enum MouseEvent : uint { Move = 0x0001, LeftDown = 0x0002, LeftUp = 0x0004, RightDown = 0x0008, RightUp = 0x0010, MiddleDown = 0x0020, MiddleUp = 0x0040, XDown = 0x0080, XUp = 0x0100, Wheel = 0x0800, VirtualDesk = 0x4000, Absolute = 0x8000 } #endregion #region 鼠标相关属性 /// <summary> /// 检查鼠标是否已经安装. /// </summary> public static bool Present { get { return SystemInformation.MousePresent; } } /// <summary> /// 检查鼠标是否存在滚轮 /// </summary> public static bool WheelPresent { get { if (!Present) { throw new InvalidOperationException("没有找到鼠标."); } return SystemInformation.MouseWheelPresent; } } /// <summary> /// 获取鼠标滚轮每次滚动的行数 /// </summary> public static int WheelScrollLines { get { if (!WheelPresent) { throw new InvalidOperationException("没有找到鼠标滑轮."); } return SystemInformation.MouseWheelScrollLines; } } #endregion #region 封装函数 /// <summary> /// 在当前鼠标的位置左键点击一下 /// </summary> public static void MouseClick() { mouse_event(MouseEvent.LeftDown, 0, 0, 0, UIntPtr.Zero); mouse_event(MouseEvent.LeftUp, 0, 0, 0, UIntPtr.Zero); } /// <summary> /// 移动到坐标位置点击 /// </summary> /// <param name="location">要点击的坐标位置,屏幕绝对值</param> public static void MouseClick(Point location) { MouseMove(location); mouse_event(MouseEvent.LeftDown, 0, 0, 0, UIntPtr.Zero); mouse_event(MouseEvent.LeftUp, 0, 0, 0, UIntPtr.Zero); } /// <summary> /// 移动到坐标位置点击 /// </summary> /// <param name="location">要点击的坐标位置,屏幕绝对值</param> public static void MouseRightClick(Point location) { MouseMove(location); mouse_event(MouseEvent.RightDown, 0, 0, 0, UIntPtr.Zero); mouse_event(MouseEvent.RightUp, 0, 0, 0, UIntPtr.Zero); } /// <summary> /// 移动到坐标位置 /// </summary> /// <param name="location">要移动到的坐标位置,屏幕绝对值</param> public static void MouseMove(Point location) { SetCursorPos(location.X, location.Y); } #endregion } }
测试类
using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Vicky.Helpers.TestBenches { internal class MouseTestBench : TestBench { Point point = new Point(0, 0); internal override void Test() { Console.WriteLine(Mouse.Present ? "Mouse presents" : "Mouse does not present."); Console.WriteLine(Mouse.WheelPresent ? "Mouse wheel presents" : "Mouse wheel does not present."); Console.WriteLine($"Mouse wheel scrollLines: {Mouse.WheelScrollLines}."); Console.WriteLine($"Mouse double-click time: {Mouse.GetDoubleClickTime()}."); Mouse.MouseClick(); Console.WriteLine($"Mouse left-clicked at location: ({point.X}, {point.Y})"); point = new Point(10, 10); Mouse.MouseClick(point); Console.WriteLine($"Mouse left-clicked at location: ({point.X}, {point.Y})"); point = new Point(400, 300); Mouse.MouseRightClick(point); Console.WriteLine($"Mouse right-clicked at the location: ({point.X}, {point.Y})"); point = new Point(200, 200); Mouse.MouseMove(point); Console.WriteLine($"Mouse moved to the location: ({point.X}, {point.Y})"); } } }