Вопрос помечен 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 ().