Как я могу программно генерировать события нажатия клавиш на С#?

Как я могу программно создать событие, которое будет имитировать нажатие клавиши на клавиатуре?

Ответ 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)

И что это!