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



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

1627   5  

5 ответов:

вопрос помечен 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 }
  );

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

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

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

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

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

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

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

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

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

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

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

    Install-Package InputSimulator

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

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

и это все!

Comments

    Ничего не найдено.