Как я могу программно генерировать события нажатия клавиш в C #? - PullRequest
103 голосов
/ 29 октября 2009

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

Ответы [ 5 ]

141 голосов
/ 30 октября 2009

Вопрос помечен WPF, но до сих пор есть конкретные ответы WinForms и Win32.

Чтобы сделать это в WPF, просто создайте KeyEventArgs и вызовите RaiseEvent для цели. Например, чтобы отправить событие KeyDown вставки ключа в текущий элемент:

  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 ().

26 голосов
/ 01 сентября 2012

Чтобы создать ключевые события без контекста 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

22 голосов
/ 29 октября 2009

Я не использовал его, но SendKeys может делать то, что вы хотите.

Используйте SendKeys для отправки нажатий клавиш и комбинации клавиш для активных приложение. Этот класс не может быть инстанцирован. Чтобы отправить нажатие клавиши класс и сразу продолжить с поток вашей программы, используйте Отправить. к ждать любых процессов, запущенных нажатие клавиши, используйте SendWait.

System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");

У Microsoft есть еще несколько примеров использования здесь .

10 голосов
/ 04 мая 2016

Легко! (потому что кто-то другой уже сделал работу за нас ...)

Потратив много времени на попытки с предложенными ответами, я наткнулся на этот проект codeplex Windows Input Simulator , который упростил имитацию нажатия клавиши:

  1. Установить пакет можно, либо из диспетчера пакетов NuGet, либо из консоли диспетчера пакетов, например:

    Install-Package InputSimulator

  2. Используйте эти 2 строки кода:

    inputSimulator = new InputSimulator() inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)

И это все!

7 голосов
/ 29 октября 2009

Windows SendMessage API с отправкой WM_KEYDOWN .

...