当前位置: 首页 > news >正文

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();

注意事项

  1. 权限要求

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

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

http://www.dtcms.com/a/520652.html

相关文章:

  • 中国热门网站wordpress中英双语选择
  • DDD(三)领域模型关键词解释、领域模型分类、关系图
  • Reward Design with Language Models 译读笔记
  • 江门网站快速排名阳江一中启业网
  • 【SpringCloud】回顾微服务
  • 【奇思妙想】Windows 设置在当前目录打开 Windows Terminal
  • 如何建设类似大众点评网站wordpress 调用所有
  • 企业网站导航设计广东建立网站
  • langchain_neo4j 以及 neo4j (windows-community) 的学习使用
  • linux 网站开发用个人的信息备案网站
  • FPGA开发 | Verilog条件语句详解与应用解析
  • 网站开发待遇高吗网页源代码提取音频
  • 图表控件Aspose.Diagram教程:在C#中将VSD转换为PDF
  • 网站改版对seo中山市网站建设公司
  • 组合总和——回溯模版
  • 大型网站制作导图有网站代码 如何建设网站
  • android开发和网站开发网络营销推广方案怎么做
  • 学pytorch的第一日
  • AI编程 -- LangChain
  • 网络层:数据平面
  • 【大话码游之 Observation 传说】中集:仙流暗涌,计数迷踪现
  • 华美天一建筑公司网站松江网站建设培训
  • 用微魔方做的网站一定要加网站友情链接出售
  • 一个真的可以优化论文的开源项目——Ai-Review
  • 网站制作要用哪些软件有哪些开源购物商城
  • 培训前端网站开发学网站开发要学什么
  • 校招三方签约问题
  • 动态规划的“升维”之技:二维前缀和,让矩阵查询“降维打击”
  • Neo4j 版本选型与 Java 技术栈深度解析:Spring Data Neo4j vs Java Driver,如何抉择?
  • 营销推广运营 网站黑色网站模板