Search code examples
c#.netwpfkeyboard-events

How can I programmatically generate keypress events in C#?


How can I programmatically create an event that would simulate a key being pressed on the keyboard?


Solution

  • The question is tagged WPF but the answers so far are specific WinForms and Win32.

    To do this in WPF, simply construct a KeyEventArgs and call RaiseEvent on the target. For example, to send an Insert key KeyDown event to the currently focused element:

    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 }
    );
    

    This solution doesn't rely on native calls or Windows internals and should be much more reliable than the others. It also allows you to simulate a keypress on a specific element.

    Note that this code is only applicable to PreviewKeyDown, KeyDown, PreviewKeyUp, and KeyUp events. If you want to send TextInput events you'll do this instead:

    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 }
    );
    

    Also note that:

    • Controls expect to receive Preview events, for example PreviewKeyDown should precede KeyDown

    • Using target.RaiseEvent(...) sends the event directly to the target without meta-processing such as accelerators, text composition and IME. This is normally what you want. On the other hand, if you really do what to simulate actual keyboard keys for some reason, you would use InputManager.ProcessInput() instead.