Как я могу программно создать событие, которое будет имитировать нажатие клавиши на клавиатуре?
Как я могу программно генерировать события нажатия клавиш на С#?
Ответ 1
Вопрос помечен WPF, но ответы до сих пор являются конкретными WinForms и Win32.
Чтобы сделать это в WPF, просто создайте KeyEventArgs и вызовите RaiseEvent на цель. Например, чтобы отправить событие KeyDown для ключевого слова Insert в текущий сфокусированный элемент:
var key = Key.Insert; // Key to send
var target = Keyboard.FocusedElement; // Target element
var routedEvent = Keyboard.KeyDownEvent; // Event to send
target.RaiseEvent(
new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(target),
0,
key)
{ RoutedEvent=routedEvent }
);
Это решение не полагается на собственные вызовы или внутренности Windows и должно быть намного надежнее других. Он также позволяет вам моделировать нажатие клавиши на конкретном элементе.
Обратите внимание, что этот код применим только к событиям PreviewKeyDown, KeyDown, PreviewKeyUp и KeyUp. Если вы хотите отправить события TextInput, вы сделаете это вместо этого:
var text = "Hello";
var target = Keyboard.FocusedElement;
var routedEvent = TextCompositionManager.TextInputEvent;
target.RaiseEvent(
new TextCompositionEventArgs(
InputManager.Current.PrimaryKeyboardDevice,
new TextComposition(InputManager.Current, target, text))
{ RoutedEvent = routedEvent }
);
Также обратите внимание:
-
Элементы управления ожидаются для получения предварительного просмотра события, например PreviewKeyDown должен предшествовать KeyDown
-
Использование target.RaiseEvent(...) отправляет событие непосредственно в целевой без метаобработки, таких как ускорители, текст и IME. Обычно это то, что вы хотите. С другой стороны, если вы действительно что имитировать фактические клавиши клавиатуры по какой-то причине вы бы использовали InputManager.ProcessInput().
Ответ 2
Чтобы создавать ключевые события без контекста Windows Forms, Мы можем использовать следующий метод:
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
приведен пример кода ниже:
const int VK_UP = 0x26; //up key
const int VK_DOWN = 0x28; //down key
const int VK_LEFT = 0x25;
const int VK_RIGHT = 0x27;
const uint KEYEVENTF_KEYUP = 0x0002;
const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
int press()
{
//Press the key
keybd_event((byte)VK_UP, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
return 0;
}
Список виртуальных ключей определяется здесь.
Чтобы получить полное изображение, пожалуйста, используйте приведенную ниже ссылку, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html
Ответ 3
Я не использовал его, но SendKeys может делать то, что вы хотите.
Используйте SendKeys для отправки нажатий клавиш и комбинации клавиш с активными выражение. Этот класс не может быть инстанцирован. Чтобы отправить нажатие клавиши класса и немедленно продолжить поток вашей программы, используйте "Отправить". к дождитесь, пока какие-либо процессы, запущенные нажатие клавиши, используйте SendWait.
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
В Microsoft есть несколько примеров использования здесь.
Ответ 4
Легко! (потому что кто-то еще сделал работу для нас...)
Проведя много времени, пытаясь сделать это с помощью предложенных ответов, я наткнулся на этот проект codeplex Windows Input Simulator, который сделал его простым, как можно чтобы имитировать нажатие клавиши:
-
Установите пакет, можно сделать или из диспетчера пакетов NuGet или из консоли диспетчера пакетов, например:
Install-Package InputSimulator
-
Используйте эти две строки кода:
inputSimulator = new InputSimulator() inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
И что это!
Ответ 5
Windows API SendMessage с отправкой WM_KEYDOWN.