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