在Winforms中使用带有C#的InputSimulator以正确的方式模拟按键

本文概述

  • 使用InputSimulator的优点
  • 1.安装InputSimulator
  • 2.使用InputSimulator
当然, 与Winforms一起工作的所有C#开发人员都知道片段, 只要你知道代码, 这些片段就可以模拟任何按键的按键操作:
// Import the user32.dll[DllImport("user32.dll", SetLastError = true)]static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); // Declare some keyboard keys as constants with its respective code// See Virtual Code Keys: https://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspxpublic const int KEYEVENTF_EXTENDEDKEY = 0x0001; //Key down flagpublic const int KEYEVENTF_KEYUP = 0x0002; //Key up flagpublic const int VK_RCONTROL = 0xA3; //Right Control key code// Simulate a key press eventkeybd_event(VK_RCONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_RCONTROL, 0, KEYEVENTF_KEYUP, 0);

但是, 这可能会让人头痛。这就是为什么在本文中, 我们将向你展示使用InputSimulator模拟按键事件的正确方法。 Windows输入模拟器提供了一个简单的.NET(C#)接口, 以使用Win32 SendInput方法模拟键盘或鼠标输入。所有Interop都已为你完成, 并且有一个简单的编程模型可以发送多个击键。
使用InputSimulator的优点 Windows窗体提供了SendKeys方法, 该方法可以模拟文本输入, 但不能模拟实际的击键。 Windows输入模拟器可用于WPF, Windows窗体和控制台应用程序中, 以合成或模拟任何键盘输入, 包括控件, Alt, Shift, Tab, Enter, 空格, Backspace, Windows键, Caps Lock, Num Lock, Scroll Lock, Volume上/下和静音, Web, 邮件, 搜索, 收藏夹, 功能键, 后退和前进导航键, 可编程键以及虚拟键表中定义的任何其他键。它提供了一个简单的API, 可以模拟文本输入, 按下键, 按下键, 按下按键以及复杂的修改后的按键和弦。
想开始使用该库吗?然后继续阅读!
1.安装InputSimulator 首先需要轻松模拟按键和击键的方法是通过nuGet将库安装在项目中。打开你的Winforms C#项目, 然后在解决方案资源管理器中打开NuGet程序包管理器:
在Winforms中使用带有C#的InputSimulator以正确的方式模拟按键

文章图片
转到浏览选项卡并搜索InputSimulator:
在Winforms中使用带有C#的InputSimulator以正确的方式模拟按键

文章图片
从列表中选择Michael Noonan的软件包并安装。软件包安装完成后, 你将可以在课堂上使用它。有关此库和示例的更多信息, 请访问Github上的官方存储库。
2.使用InputSimulator 在使用Input Simulator之前, 你需要在类的顶部包括所需的类型:
using WindowsInput.Native; using WindowsInput;

虚拟代码清单
如果要模拟任何键的keypress事件, 则需要可以在此列表中获得的键码。但是, 你可以简单地使用WindowsInput.Native.VirtualKeyCode的enum属性, 该属性具有每个键的属性。
模拟按键
要模拟单个按键事件, 请使用Keyboard.KeyPress方法, 该方法需要你要模拟的按键的虚拟按键代码:
InputSimulator sim = new InputSimulator(); // Press 0 keysim.Keyboard.KeyPress(VirtualKeyCode.VK_0); // Press 1sim.Keyboard.KeyPress(VirtualKeyCode.VK_1); // Press bsim.Keyboard.KeyPress(VirtualKeyCode.VK_B); // Press vsim.Keyboard.KeyPress(VirtualKeyCode.VK_V); // Press entersim.Keyboard.KeyPress(VirtualKeyCode.RETURN); // Press Left CTRL buttonsim.Keyboard.KeyPress(VirtualKeyCode.LCONTROL);

如前所述, 此逻辑不仅限于单个按键事件, 对于KeyDown和KeyUp也是如此。
模拟按键
如果要模拟按键或键盘快捷方式, 可以使用键盘的ModifiedKeyStroke功能:
InputSimulator sim = new InputSimulator(); // CTRL + C (effectively a copy command in many situations)sim.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C); // You can simulate chords with multiple modifiers// For example CTRL + K + C whic is simulated as// CTRL-down, K, C, CTRL-upsim.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL, new[] {VirtualKeyCode.VK_K, VirtualKeyCode.VK_C}); // You can simulate complex chords with multiple modifiers and key presses// For example CTRL-ALT-SHIFT-ESC-K which is simulated as// CTRL + down, ALT + down, SHIFT + down, press ESC, press K, SHIFT-up, ALT-up, CTRL-upsim.Keyboard.ModifiedKeyStroke(new[] { VirtualKeyCode.CONTROL, VirtualKeyCode.MENU, VirtualKeyCode.SHIFT }, new[] { VirtualKeyCode.ESCAPE, VirtualKeyCode.VK_K });

输入整个单词
键盘的TextEntry方法通过键盘模拟不间断的文本输入:
InputSimulator Simulator = new InputSimulator(); Simulator.Keyboard.TextEntry("Hello World !");

模拟器API是可链接的, 因此你可以使用Sleep方法在启动之前或键入内容后等待几毫秒:
InputSimulator Simulator = new InputSimulator(); // Wait a second to start typingSimulator.Keyboard.Sleep(1000)// Type Hello World.TextEntry("Hello World !")// Wait another second.Sleep(1000)// Type More text.TextEntry("Type another thing");

模拟按字符键入文本
如果你很懒惰, 并且想要创建使你的生活更轻松的代码片段, 则可能需要创建某种类型的roboscript, 为你编写一些文本。显然, 文本必须已经存在, 因此可以在不能键入错误的视频等项目中使用:
/// < summary> /// Simulate typing of any text as you do when you write./// < /summary> /// < param name="Text"> Text that will be written automatically by simulation.< /param> /// < param name="typingDelay"> Time in ms to wait after 1 character is written.< /param> /// < param name="startDelay"> < /param> private void simulateTypingText(string Text, int typingDelay = 100, int startDelay = 0){InputSimulator sim = new InputSimulator(); // Wait the start delay timesim.Keyboard.Sleep(startDelay); // Split the text in lines in case it hasstring[] lines = Text.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None); // Some flags to calculate the percentageint maximum = lines.Length; int current = 1; foreach (string line in lines){// Split line into characterschar[] words = line.ToCharArray(); // Simulate typing of the char i.e: a, e , i , o , u etc// Apply immediately the typing delayforeach (char word in words){sim.Keyboard.TextEntry(word).Sleep(typingDelay); }float percentage = ((float)current / (float)maximum) * 100; current++; // Add a new line by pressing ENTER// Return to start of the line in your editor with HOMEsim.Keyboard.KeyPress(VirtualKeyCode.RETURN); sim.Keyboard.KeyPress(VirtualKeyCode.HOME); // Show the percentage in the consoleConsole.WriteLine("Percent : {0}", percentage.ToString()); }}

该方法期望将要像人类键入的文本作为第一个参数。默认的键入延迟为100毫秒, 通常是每次按键后人类的键入延迟。最后一个参数是可选的, 仅在开始输入时提供时间延迟:
// Simulate typing text of a textbox multilinesimulateTypingText(textBox1.Text); // Simulate typing slowly by waiting half second after typing every charactersimulateTypingText(textBox1.Text, 500); // Simulate typing slowly by waiting half second after typing every character// and wait 5 seconds before startingsimulateTypingText(textBox1.Text, 500, 5000);

【在Winforms中使用带有C#的InputSimulator以正确的方式模拟按键】编码愉快!

    推荐阅读