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

Библиотека Предприятия является твердой альтернативой log4net, и это предлагает набор других возможностей также (кэширование, обработка исключений, проверка, и т.д....). Я использую его на примерно каждом проекте, который я разрабатываю.

Наиболее рекомендуемый.

104
задан Dave Clemmer 25 August 2011 в 05:43
поделиться

3 ответа

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

Чтобы сделать это в WPF, просто создайте KeyEventArgs и вызовите RaiseEvent для цели. Например, чтобы отправить событие Insert key 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 }
  );

Также обратите внимание, что:

  • Элементы управления ожидают получения Preview события, например PreviewKeyDown должен предшествовать KeyDown

  • . Использование target.RaiseEvent (...) отправляет событие непосредственно в цель без мета-обработки, такой как ускорители, составление текста и IME. Обычно это то, что вы хотите. С другой стороны, если действительно что имитировать реальные клавиши клавиатуры по какой-то причине вы бы использовали Вместо этого InputManager.ProcessInput ().

144
ответ дан 24 November 2019 в 04:09
поделиться

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

7
ответ дан 24 November 2019 в 04:09
поделиться

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

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

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

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

22
ответ дан 24 November 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: