C#模拟鼠标键盘操作的多种实现方案
方案一:原生Windows API调用(基础版)
using System;
using System.Runtime.InteropServices;
using System.Threading;public class InputSimulator
{// 鼠标事件常量[Flags]public enum MouseEventFlags : uint{LeftDown = 0x0002,LeftUp = 0x0004,Move = 0x0001,Absolute = 0x8000}// 键盘事件常量public enum KeyEventFlags : uint{KeyDown = 0x0000,KeyUp = 0x0002}[DllImport("user32.dll")]private static extern bool SetCursorPos(int x, int y);[DllImport("user32.dll")]private static extern void mouse_event(MouseEventFlags dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);[DllImport("user32.dll")]private static extern void keybd_event(byte bVk, byte bScan, KeyEventFlags dwFlags, int dwExtraInfo);// 鼠标操作public static void MoveTo(int x, int y) => SetCursorPos(x, y);public static void LeftClick() => mouse_event(MouseEventFlags.LeftDown | MouseEventFlags.LeftUp, 0, 0, 0, 0);// 键盘操作public static void PressKey(byte keyCode){keybd_event(keyCode, 0, KeyEventFlags.KeyDown, 0);Thread.Sleep(50); // 防抖延迟keybd_event(keyCode, 0, KeyEventFlags.KeyUp, 0);}// 组合键示例:Ctrl+Cpublic static void CtrlC(){PressKey(0x11); // CtrlPressKey(0x43); // C}
}
方案二:使用System.Windows.Forms(简单场景)
using System;
using System.Windows.Forms;public class InputHelper
{// 模拟键盘输入字符串(支持特殊字符)public static void SendString(string text){SendKeys.SendWait(text);SendKeys.Flush();}// 模拟鼠标双击public static void DoubleClick(int x = -1, int y = -1){if (x != -1 && y != -1) Cursor.Position = new Point(x, y);MouseSimulator.Click(MouseButtons.Left, 2);}// 鼠标移动+点击组合public static void MoveAndClick(int x, int y){Cursor.Position = new Point(x, y);MouseSimulator.Click(MouseButtons.Left);}
}// 扩展鼠标操作
public static class MouseSimulator
{[System.Runtime.InteropServices.DllImport("user32.dll")]private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo);private const uint MOUSEEVENTF_LEFTDOWN = 0x02;private const uint MOUSEEVENTF_LEFTUP = 0x04;public static void Click(MouseButtons button, int clicks = 1){if (button == MouseButtons.Left){mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);}// 其他按键逻辑类似...}
}
方案三:第三方库InputSimulator(高级功能)
// NuGet安装:Install-Package H.InputSimulator
using H.InputSimulator;public class AdvancedInput
{private static readonly InputSimulator sim = new InputSimulator();// 组合键操作:Win+R打开运行窗口public static void OpenRunDialog(){sim.Keyboard.ModifiedKeyStroke(VirtualKeyCode.LWIN, VirtualKeyCode.VK_R);}// 文本输入带延迟public static void TypeWithDelay(string text, int delayMs = 100){foreach (char c in text){sim.Keyboard.TextEntry(c.ToString());Thread.Sleep(delayMs);}}// 鼠标拖拽操作public static void DragAndDrop(int startX, int startY, int endX, int endY){sim.Mouse.MoveTo(startX, startY);sim.Mouse.Press(MouseButton.Left);sim.Mouse.MoveTo(endX, endY);sim.Mouse.Release(MouseButton.Left);}
}
方案四:全局钩子方案(跨进程监控)
// NuGet安装:Install-Package GlobalMouseKeyHook
using GlobalMouseKeyHook;
using GlobalMouseKeyHookLib;public class InputMonitor
{private static IKeyboardMouseEvents _globalHook;public static void StartMonitoring(){_globalHook = Hook.GlobalEvents();_globalHook.KeyDown += (s, e) => {Console.WriteLine($"按下了: {e.KeyboardState}");if (e.KeyboardState == Keys.F12) _globalHook?.Dispose();};_globalHook.MouseDown += (s, e) => Console.WriteLine($"鼠标按下: {e.Button}");}
}
使用示例
// 基础点击操作
InputSimulator.MoveTo(500, 500);
InputSimulator.LeftClick();// 字符串输入
InputHelper.SendString("Hello World{ENTER}"); // 包含回车// 高级组合键
AdvancedInput.OpenRunDialog();// 监控全局按键
InputMonitor.StartMonitoring();
注意事项
-
权限要求
- 需要以管理员权限运行程序才能模拟其他应用程序的输入
- 某些安全软件可能拦截模拟操作
-
延迟控制
Thread.Sleep(100); // 操作间添加延迟提高稳定性 -
坐标系统
- 屏幕坐标原点(0,0)在左上角
- 使用
Cursor.Position获取当前坐标
-
兼容性
- .NET Framework 4.0+ 或 .NET Core 3.1+ 环境
- 避免在UWP应用中使用原生API
参考代码 C# 模拟鼠标键盘操作源码 www.youwenfan.com/contentcsj/62644.html
方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 原生API | 灵活性高,无依赖 | 代码复杂,需处理坐标转换 |
| WinForms | 简单易用 | 仅支持基础操作 |
| InputSimulator | 支持高级功能 | 需要安装NuGet包 |
| 全局钩子 | 跨进程监控 | 实现复杂,资源占用较高 |
建议根据需求选择方案:简单操作用原生API,复杂自动化用InputSimulator,监控需求用全局钩子。
