使用Input Simulator模拟键盘与鼠标的输入 (.NET C sharp)

简介: 直接使用user32.dll控制键盘与鼠标的操作是较为麻烦的,幸好有Input Simulator这个工具帮我们解决了很多问题

InputSimulator

在InputSimulator之前,模拟键盘与鼠标的操作是非常痛苦的,如果我们想按下一个ctrl键:

[DllImport("user32.dll", SetLastError = true)]
static extern void KEYBD_EVENT(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); 
public const int KEYEVENTF_EXTENDEDKEY = 0x0001;
public const int KEYEVENTF_KEYUP = 0x0002;
public const int VK_RCONTROL = 0xA3;
KEYBD_EVENT(VK_RCONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0);
KEYBD_EVENT(VK_RCONTROL, 0, KEYEVENTF_KEYUP, 0);

这看起来有点汇编的味道,我们需要频繁的查阅MSDN [https://docs.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes?redirectedfrom=MSDN],最后甚至定义了上百行const int,在Win Form中,我们可以使用SendKeys,它的参数非常古怪,看起来像是制作了一种专用的DSL,而且很多情况下它是无效的,不能模拟出实际的键盘操作,如果你不喜欢这两种方式,那么你应该使用InputSimulator

InputSimulator提供了一个简单的.NET C#键盘输入接口,使用Win32 SendInput方法模拟键盘或鼠标的标输入,可以同时触发多个键或鼠标,也可以输入文本,模拟剪切板操作,鼠标左右键点击,可以在NuGet中下载安装InputSimulator,或者在Github中clone它。


例如按下A键
``` csharp
InputSimulator.SimulateKeyPress(VirtualKeyCode.VK_A);

为了兼容更多的应用程序,InputSimulatorPlus诞生了,它的使用方式和InputSimulator别无二致。在InputSimulatorPlus的基础上,又出现了InputSimulatorStandard,它支持.Net Standard,去掉了InputSimulator中的静态方法,如上面的例子中,应该这样写:

var simulator = new InputSimulator();
simulator.Keyboard.KeyPress(VirtualKeyCode.VK_A);

显然在更多的情况下,这是一种较好的方式

下面粗略介绍一些用例,我默认已经定义了
var simulator = new InputSimulator();

通常我们需要按下组合键,使用ModifiedKeyStroke是最简便的,它能模拟复制与粘贴

simulator.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C);
simulator.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_V);

按住shift键的时候,按下其他字母键,输入的字母会变成大写,运行下面的用例,会输入文本"ABC"

simulator.Keyboard.SimulateKeyDown(VirtualKeyCode.SHIFT);//按下shift
simulator.Keyboard.SimulateKeyPress(VirtualKeyCode.VK_A);//输入a
simulator.Keyboard.SimulateKeyPress(VirtualKeyCode.VK_B);
simulator.Keyboard.SimulateKeyPress(VirtualKeyCode.VK_C);
simulator.Keyboard.SimulateKeyUp(VirtualKeyCode.SHIFT);//释放shift

当然有更简便的方法,使用方法TextEntry直接输入ABC

simulator.Keyboard.TextEntry("ABC");

直接使用simulator.Keyboard.SimulateKeyPress(VirtualKeyCode.VK_A);时,你可能不知道自己输入了大写的A还是小写的a,这时候首先想到要去检测一个键是否处于被按下的状态,例如shift键

bool isShiftKeyDown = simulator.InputDeviceState.IsKeyDown(VirtualKeyCode.SHIFT);

但是它对大小写是否开启的判断是无效的,下面的代码就无法检测出当前的键盘状态是处于大写还是小写

bool isCapsLockOn = simulator.InputDeviceState.IsKeyDown(VirtualKeyCode.CAPITAL);

原因很简单,Caps Lock键不像shift,ctrl,alt一类的控制键,需要持续的按下。它只需要按下一次,就会开启。那么应该使用IsTogglingKeyInEffect,它可以检查一个切换键是否被启用,当然,除了Caps Lock,还有Scroll LockNum Lock

bool isCapsLockOn = simulator.InputDeviceState.IsTogglingKeyInEffect(VirtualKeyCode.CAPITAL);

鼠标的操作也非常简便

左键单击,右键双击

simulator.Mouse.LeftButtonClick();
simulator.Mouse.RightButtonDoubleClick();

向上垂直滚动一格,向下垂直滚动两格

simulator.Mouse.VerticalScroll(1);
simulator.Mouse.VerticalScroll(-2);

想移动鼠标到指定位置则比较复杂,你需要先获取屏幕大小,你可以使用SystemParameters来获取当前主屏的屏幕大小

var screenHeight = SystemParameters.PrimaryScreenHeight;
var screenWidth = SystemParameters.PrimaryScreenWidth;

也可以获取到所有屏幕的全屏大小

var screenHeight = SystemParameters.FullPrimaryScreenHeight;
var screenWidth = SystemParameters.FullPrimaryScreenWidth;

如果你在Win Form中,也可以使用System.Windows.Forms.Screen获取主屏的大小

int screenWidth = Screen.PrimaryScreen.Bounds.Width;
int screenHeight = Screen.PrimaryScreen.Bounds.Height;

全屏大小则需要通过Screen中的AllScreensBounds自行计算,过程较为复杂

获取到屏幕大小之后,我们将坐标(30,50)进行计算,获取到屏幕中的绝对位置

int X = 30 * 0xffff / screenWidth;
int Y = 50 * 0xffff / screenHeight;

然后转换为double,代入MoveMouseToPositionOnVirtualDesktop,操作就完成了

simulator.Mouse.MoveMouseToPositionOnVirtualDesktop(Convert.ToDouble(X), Convert.ToDouble(Y));

具体的用例除了NuGet与Github的主页面中有介绍外,在下面的一些文章中也有介绍它

目录
相关文章
|
消息中间件 安全 API
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
SendMessage/PostMessage API 可以实现发送系统消息,这些消息可以定义为常见的鼠标或键盘事件、数据的发送等各种系统操作......
7752 1
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
|
JavaScript 关系型数据库 MySQL
盘点6个.NetCore+Vue前后端分离的开源项目
盘点6个.NetCore+Vue前后端分离的开源项目
2667 0
|
机器学习/深度学习 算法 计算机视觉
yolov8人脸识别-脸部关键点检测(代码+原理)
yolov8人脸识别-脸部关键点检测(代码+原理)
|
运维 Kubernetes 网络协议
『Consul』.NET Core快速接入Consul实现统一配置中心
📣读完这篇文章里你能收获到 - .NET Core快速接入Consul代码Demo - 了解配置中心的概念
1096 0
『Consul』.NET Core快速接入Consul实现统一配置中心
|
编译器 API C#
技术心得记录:深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解
技术心得记录:深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解
|
开发框架 .NET 测试技术
了解 .NET 9 中的新 Microsoft.AspNetCore.OpenApi 包,并将其与 NSwag 和 Swashbuckle.AspNetCore 进行比较。
本文介绍了 `.NET 9` 中新推出的 `Microsoft.AspNetCore.OpenApi` 包,该包旨在为 `ASP.NET Core` 应用程序生成 `OpenAPI` 文档。文章对比了 `NSwag` 和 `Swashbuckle.AspNetCore` 两大现有库,探讨了新包的优势和不足,特别是在性能和功能方面。尽管新包在某些方面尚不及成熟库完善,但其对原生 `AoT` 编译的支持和未来的扩展潜力使其成为一个值得考虑的选择。文章还提供了详细的性能测试数据和优化建议,适合对 `OpenAPI` 文档生成感兴趣的开发者阅读。
683 4
了解 .NET 9 中的新 Microsoft.AspNetCore.OpenApi 包,并将其与 NSwag 和 Swashbuckle.AspNetCore 进行比较。
|
Web App开发 网络协议 API
基于C#编写一个远程桌面应用
基于C#编写一个远程桌面应用
626 0
|
搜索推荐 前端开发 C#
推荐7款美观且功能强大的WPF UI库
推荐7款美观且功能强大的WPF UI库
1183 2
|
前端开发 JavaScript C#
C#开发者的新天地:Blazor如何颠覆传统Web开发,打造下一代交互式UI?
【8月更文挑战第28天】Blazor 是 .NET 生态中的革命性框架,允许使用 C# 和 .NET 构建交互式 Web UI,替代传统 JavaScript。本文通过问答形式深入探讨 Blazor 的基本概念、优势及应用场景,并指导如何开始使用 Blazor。Blazor 支持代码共享、强类型检查和丰富的生态系统,简化 Web 开发流程。通过简单的命令即可创建 Blazor 应用,并利用其组件化和数据绑定特性快速搭建界面。无论对于 .NET 还是 Web 开发者,Blazor 都是一个值得尝试的新选择。
1000 1
|
API C# Windows
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
本篇主要介绍一些与窗口句柄相关的一些API,比如设置窗口状态、当前激活的窗口、窗口客户区的大小、鼠标位置、禁用控件等,以及介绍Winform中的句柄属性,便于直接获取控件或窗体句柄,以及不推荐...
4714 0
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】

热门文章

最新文章