方案一:原生Windows API调用(基础版)
csharp
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+C
public static void CtrlC()
{
PressKey(0x11); // Ctrl
PressKey(0x43); // C
}
}
方案二:使用System.Windows.Forms(简单场景)
csharp
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(高级功能)
csharp
// 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);
}
}
方案四:全局钩子方案(跨进程监控)
csharp
// 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}");
}
}
使用示例
csharp
// 基础点击操作
InputSimulator.MoveTo(500, 500);
InputSimulator.LeftClick();
// 字符串输入
InputHelper.SendString("Hello World{ENTER}"); // 包含回车
// 高级组合键
AdvancedInput.OpenRunDialog();
// 监控全局按键
InputMonitor.StartMonitoring();
注意事项
-
权限要求
- 需要以管理员权限运行程序才能模拟其他应用程序的输入
- 某些安全软件可能拦截模拟操作
-
延迟控制
csharpThread.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,监控需求用全局钩子。