C#模拟鼠标键盘操作的多种实现方案

方案一:原生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();

注意事项

  1. 权限要求

    • 需要以管理员权限运行程序才能模拟其他应用程序的输入
    • 某些安全软件可能拦截模拟操作
  2. 延迟控制

    csharp 复制代码
    Thread.Sleep(100); // 操作间添加延迟提高稳定性
  3. 坐标系统

    • 屏幕坐标原点(0,0)在左上角
    • 使用Cursor.Position获取当前坐标
  4. 兼容性

    • .NET Framework 4.0+ 或 .NET Core 3.1+ 环境
    • 避免在UWP应用中使用原生API

参考代码 C# 模拟鼠标键盘操作源码 www.youwenfan.com/contentcsj/62644.html

方案对比

方案 优点 缺点
原生API 灵活性高,无依赖 代码复杂,需处理坐标转换
WinForms 简单易用 仅支持基础操作
InputSimulator 支持高级功能 需要安装NuGet包
全局钩子 跨进程监控 实现复杂,资源占用较高

建议根据需求选择方案:简单操作用原生API,复杂自动化用InputSimulator,监控需求用全局钩子。

相关推荐
Yeats_Liao4 小时前
Go Web 编程快速入门 06 - 响应 ResponseWriter:状态码与头部
开发语言·后端·golang
mit6.8244 小时前
[Agent可视化] 编排工作流(Go) | Temporal引擎 | DAG调度器 | ReAct模式实现
开发语言·后端·golang
Devil枫4 小时前
HarmonyOS鸿蒙应用:仓颉语言与JavaScript核心差异深度解析
开发语言·javascript·ecmascript
future_studio4 小时前
聊聊 Unity(小白专享、C# 小程序 之 联机对战)
unity·小程序·c#
惺忪97984 小时前
回调函数的概念
开发语言·前端·javascript
pcm1235674 小时前
java中的单例模式
java·开发语言·单例模式
kaikaile19954 小时前
Java面试题总结
开发语言·python
wuk9985 小时前
C#和NModbus库实现Modbus从站
开发语言·c#
周周记笔记5 小时前
Python及Ipython解释器
开发语言·python