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,监控需求用全局钩子。

相关推荐
霸道流氓气质23 分钟前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
路溪非溪1 小时前
Python语言的执行流程总结
开发语言·python
民乐团扒谱机1 小时前
【超详解】量子克拉美罗下界QCRB:时延估计精度极限推导+MATLAB多场景绘图实战
开发语言·机器学习·matlab·量子力学·qcrb
花落人散处1 小时前
CDiskClean 开发历程 —— 文件清理_目录树解析实现方案参考
c#
乐观勇敢坚强的老彭2 小时前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
离陌在学C#2 小时前
C# 泛型:从基础到高级应用
开发语言·c#
ly76892 小时前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式
SomeB1oody2 小时前
【RustyML入门】2.13. 孤立森林
开发语言·后端·机器学习·rust·教程
Vertira2 小时前
C# 与 OpencvSharp 编程[基础目录]
c#
萧瑟余晖2 小时前
Java深入解析篇三十之Java日志框架
java·开发语言