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

Необходимо написать метод, принимающий строку в виде любого текста, который в результате должен написать этот текст в любое поле ввода имитируя ввод с клавиатуры.

Недавно я уже задавал похожий вопрос, но там речь была о нажатии конкретных клавиш клавиатуры, коды для которых уже имеются в виде enum. Здесь же речь идет вообще о любых символах - то есть должен имитироваться ввод подобного текста: "??³⁸⁽⋜?" и т.п.


Что я пробовал:

System.Windows.Forms.SendKeys.SendWait("??³⁸⁽⋜?");

Это работает только для полей ввода в приложении, т.к. Keyboard фокусируется только на ни х. (Решение взял отсюда)

var text = "??³⁸⁽⋜?";
var target = Keyboard.FocusedElement;
var routedEvent = TextCompositionManager.TextInputEvent;

target.RaiseEvent(
  new TextCompositionEventArgs(
    InputManager.Current.PrimaryKeyboardDevice,
    new TextComposition(InputManager.Current, target, text))
  { RoutedEvent = routedEvent }
);

Ответы (1 шт):

Автор решения: aepot

Можно эмулировать ввод с помощью того же SendInput, на базе структур из прошлого ответа.

public static void SendStringInput(string text)
{
    static NativeMethods.INPUT BuildINPUT(char c) => new NativeMethods.INPUT
    {
        type = NativeMethods.InputType.Keyboard,
        union = new NativeMethods.InputUnion { keyboard = new NativeMethods.KEYBDINPUT { virtualKey = 0, scanCode = (ushort)c, flags = NativeMethods.KeyboardFlags.Unicode, timeStamp = 0, extraInfo = IntPtr.Zero } }
    };
    NativeMethods.INPUT[] inputs = new NativeMethods.INPUT[text.Length];
    for (int i = 0; i < text.Length; i++)
    {
        inputs[i] = BuildINPUT(text[i]);
    }
    _ = NativeMethods.SendInput(inputs.Length, inputs, NativeMethods.SizeOfInput);
}
→ Ссылка