Правильное моделирование нажатия клавиш с использованием InputSimulator с C # в Winforms

Конечно, все разработчики C #, работающие с Winforms, знают фрагменты, которые позволяют имитировать нажатие любой клавиши, если вы знаете код:

// 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).aspx
public const int KEYEVENTF_EXTENDEDKEY = 0x0001; //Key down flag
public const int KEYEVENTF_KEYUP = 0x0002; //Key up flag
public const int VK_RCONTROL = 0xA3; //Right Control key code
// Simulate a key press event
keybd_event(VK_RCONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(VK_RCONTROL, 0, KEYEVENTF_KEYUP, 0); 

Однако это может стать головной болью для поддержания. Вот почему в этой статье мы покажем вам правильный способ имитации событий нажатия клавиш с помощью InputSimulator. Windows Input Simulator предоставляет простой интерфейс .NET (C #) для имитации ввода с клавиатуры или мыши с помощью метода Win32 SendInput. Все Interop сделано для вас, и есть простая модель программирования для отправки нескольких нажатий клавиш.

Преимущества работы с InputSimulator

Windows Forms предоставляет метод SendKeys, который может имитировать ввод текста, но не фактические нажатия клавиш. Windows Input Simulator может использоваться в WPF, Windows Forms и консольных приложениях для синтеза или имитации любого ввода с клавиатуры, включая Control, Alt, Shift, Tab, Enter, Пробел, Backspace, клавишу Windows, Caps Lock, Num Lock, Scroll Lock, Volume Вверх / Вниз и Отключение звука, Интернет, Почта, Поиск, Избранное, Функциональные клавиши, Клавиши навигации назад и вперед, Программируемые клавиши и любые другие клавиши, определенные в таблице виртуальных клавиш. Он предоставляет простой API для имитации ввода текста, нажатия клавиш, нажатия клавиш вверх, нажатия клавиш и сложных измененных нажатий клавиш и аккордов.

Хотите начать работу с этой библиотекой? Тогда продолжайте читать!

1. Установите InputSimulator

Первое, что вам нужно, чтобы легко имитировать нажатие клавиш и нажатия клавиш, — это установить библиотеку в ваш проект с помощью nuGet. Откройте проект Winforms C # и откройте менеджер пакетов NuGet в обозревателе решений:

Перейдите на вкладку Обзор и найдите InputSimulator:

InputSimulator nuget установить

Из списка выберите пакет Майкла Нунана и установите его. После завершения установки пакета вы сможете использовать его на своих занятиях. Для получения дополнительной информации об этой библиотеке и Примеры пожалуйста посетите официальный репозиторий на Github здесь.

2. Использование InputSimulator

Перед использованием Input Simulator вам нужно будет включить необходимые типы в начало ваших классов:

using WindowsInput.Native;
using WindowsInput;

Список виртуальных кодов

Если вы хотите смоделировать событие нажатия любой клавиши, вам понадобится код, который вы можете получить в этом списке. Однако вы можете просто использовать свойство enum WindowsInput.Native.VirtualKeyCode у которого есть свойство для каждого ключа.

Имитация нажатия клавиш

Для имитации одного события нажатия клавиши используйте Keyboard.KeyPress метод, который ожидает код виртуального ключа ключа, который вы хотите смоделировать:

InputSimulator sim = new InputSimulator();
// Press 0 key
sim.Keyboard.KeyPress(VirtualKeyCode.VK_0);
// Press 1
sim.Keyboard.KeyPress(VirtualKeyCode.VK_1);
// Press b
sim.Keyboard.KeyPress(VirtualKeyCode.VK_B);
// Press v
sim.Keyboard.KeyPress(VirtualKeyCode.VK_V);
// Press enter
sim.Keyboard.KeyPress(VirtualKeyCode.RETURN);
// Press Left CTRL button
sim.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-up
sim.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-up
sim.Keyboard.ModifiedKeyStroke(
new[] { VirtualKeyCode.CONTROL, VirtualKeyCode.MENU, VirtualKeyCode.SHIFT },
new[] { VirtualKeyCode.ESCAPE, VirtualKeyCode.VK_K }
);

Введите целые слова

TextEntry Метод Keyboard имитирует непрерывный ввод текста через Keyboard:

InputSimulator Simulator = new InputSimulator();
Simulator.Keyboard.TextEntry("Hello World !");

API симулятора является цепным, поэтому вы можете использовать Sleep метод ожидания нескольких миллисекунд перед запуском или после ввода чего-либо:

InputSimulator Simulator = new InputSimulator();
// Wait a second to start typing
Simulator.Keyboard.Sleep(1000)
// Type Hello World
.TextEntry("Hello World !")
// Wait another second
.Sleep(1000)
// Type More text
.TextEntry("Type another thing")
;

Имитация ввода текста по символам

Если вы ленивы и хотите создавать фрагменты, которые облегчают вашу жизнь, вы можете создать некоторый тип робоскрипта, который напишет какой-то текст для вас. Очевидно, что текст уже должен существовать, поэтому его можно использовать в таких проектах, как видео, где вы не можете напечатать ошибки:

///
/// Simulate typing of any text as you do when you write.
///
/// Text that will be written automatically by simulation.
/// Time in ms to wait after 1 character is written.
///
private void simulateTypingText(string Text, int typingDelay = 100, int startDelay = 0)
{
InputSimulator sim = new InputSimulator();
// Wait the start delay time
sim.Keyboard.Sleep(startDelay);
// Split the text in lines in case it has
string[] lines = Text.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
// Some flags to calculate the percentage
int maximum = lines.Length;
int current = 1;
foreach (string line in lines)
{
// Split line into characters
char[] words = line.ToCharArray();
// Simulate typing of the char i.e: a, e , i ,o ,u etc
// Apply immediately the typing delay
foreach (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 HOME
sim.Keyboard.KeyPress(VirtualKeyCode.RETURN);
sim.Keyboard.KeyPress(VirtualKeyCode.HOME);
// Show the percentage in the console
Console.WriteLine("Percent : {0}", percentage.ToString());
}
}

В качестве первого аргумента метод ожидает текст, который будет напечатан так, как это сделал бы человек. Задержка набора по умолчанию составляет 100 миллисекунд, что обычно является задержкой набора текста человеком после каждого нажатия клавиши. Последний аргумент является необязательным и обеспечивает только задержку начала ввода:

// Simulate typing text of a textbox multiline
simulateTypingText(textBox1.Text);
// Simulate typing slowly by waiting half second after typing every character
simulateTypingText(textBox1.Text, 500);
// Simulate typing slowly by waiting half second after typing every character
// and wait 5 seconds before starting
simulateTypingText(textBox1.Text, 500, 5000);
Ссылка на основную публикацию
Adblock
detector