C#中的键盘操作模拟介绍了如何使用C#编程语言编写代码以实现自动化输入或模拟用户键盘操作的技术和方法。
模拟鼠标和键盘
注意:不支持Windows 8 和 Windows 8.1。
Interceptor 是一个用于包装 Windows 键盘驱动程序的工具(基于 oblita.com 提供的技术)。
通过使用驱动程序,Interceptor 可以进行按键与鼠标的模拟操作...
对于 Direct X 游戏来说,通常 SendInput() 函数无法发送击键
Windows 的受保护区域如登录屏幕或 UAC 调暗屏幕也不支持这种操作。
任何应用程序也存在同样的问题,
因为是通过驱动程序来模拟点击和按键的,所以目标窗口必须处于活动状态(即,在执行其他任务时不能进行多任务处理)。
如何使用
下载并构建此项目,并在项目中引用其 DLL 文件。
需要从 oblita.com 下载 interception.dll ,并将它放在与可执行文件相同的目录里。这是必要的步骤之一。
还需要从该网站下载 install-interception.exe 并安装,之后重启电脑。
在您的代码中,要加载驱动程序,请调用以下函数(查看下面的注释;您必须设置过滤模式以捕获按键事件或发送按键操作!):
Input input = new Input();
确保将键盘过滤器设为能够捕捉和模拟击键:
KeyboardFilterMode.All 捕捉所有事件;
Down 只捕捉非特殊键的按下;
Up 只捕捉非特殊键的释放;
E0 和 E1 用于捕捉特殊按键的按压与释放。
input.KeyboardFilterMode = KeyboardFilterMode.All;
同样,您可以设置 MouseFilterMode ,但为了模拟鼠标点击并不需要此操作。
最后加载驱动程序:
input.Load();
执行您的代码
例如:
input.MoveMouseTo(5, 5);
请注意这不使用驱动来移动光标;它使用的是 System.Windows.Forms.Cursor.Position。
input.MoveMouseBy(25, 25); 同上 ^
input.SendLeftClick();
设置延迟时间,输入按下和释放键:
input.KeyDelay = 1;
此函数用于调整按键的延时;
在非游戏应用中不需要这个参数。
例如:
input.SendKeys(Keys.Enter);
这将模拟按下并释放 Enter 键的操作。
或者您也可以使用以下两行代码实现相同的功能
input.SendKeys(Keys.Enter, KeyState.Down);
Thread.Sleep(1); 为确保游戏能够捕捉到所有事件,需在按键之间进行短暂延迟。对于反应迟缓的游戏可能需要增加至40毫秒的延时。
input.SendKeys(Keys.Enter, KeyState.Up);
输入文本:
* 所有字符、数字和符号都可以使用以下函数发送 *
例如:
input.SendText(abcdefghijklmnopqrstuvwxyz);
input.SendText(1234567890);
input.SendText(!@#$%^&*());
input.SendText([],.;);
input.SendText({|}:<>?);
最后,卸载驱动程序:
input.Unload();
注意事项:
BadImageFormatException:如果解决方案中的所有项目(包括此项目)没有使用正确的架构 (x86 或 x64),可能会遇到这个错误。因此您可能需要下载并重新构建该项目以适应相应的架构。
拦截器有一个限制,即它不能在不接收至少一次击键的情况下发送击键。
这是因为驱动程序不知道键盘的设备ID,必须等待接收到第一个按键来推断出该信息。
总之,在发送任何击键之前,请始终先按一下任意键。这一步对于模拟操作是必需的。
MoveMouseTo()和 MoveMouseBy()完全忽略键盘驱动程序。它使用的是 System.Windows.Forms.Position 来设置光标的位置,这是通过调用标准 Win32 API 实现的。
原因是,在探索键盘驱动程序的鼠标移动功能时发现其无法精确地按像素单位移动光标而是采用加速方式,这会导致不一致的结果;
因此直接调用了这些标准API来实现这个目的。请注意这只是针对设置光标的操作;拦截器仍然可以正常工作于其他情况如反转鼠标的x和y轴等操作中。