Я пытаюсь автоматизировать вставку некоторых данных в программное обеспечение. Это программное обеспечение имеет всплывающее окно, требующее ввода пароля с текстовым полем и кнопкой 2.
Я намерен написать этот пароль и нажать ENTER в этом поле с помощью сценария powershell.
Я пробовал много методов, таких как Windows.Form.SendKeys, но ни один из них не пишет в этом поле. Я даже пробовал класс InputSimulator, но даже он не может писать в этом поле. Единственное, что я пробовал, что может писать в это поле, это экранная клавиатура окна. После некоторого поиска я обнаружил, что он должен использовать команду SendInput для имитации ключа. Используя Api Monitoring, я проверил вызов и воссоздал аналогичный вызов SendInput, чтобы написать строчную букву «a», используя код, аналогичный приведенному в этом ответе: https://stackoverflow.com/a/18854441/4417646
Я пробовал со значением wVk и без него, но мой сценарий по-прежнему не может писать в этом поле. Я отслеживал все другие вызовы, связанные с клавиатурой, сделанной с экранной клавиатуры, но я не видел ни одного. Перед отправкой команды SendInput я использую код для фокусировки окна и 1 секунду сна, чтобы убедиться, что форма находится в фокусе. Если я использую тот же вызов с любым другим окном, он работает... (я пробовал с блокнотом и другим случайным программным обеспечением)
Я что-то пропустил?
Вот часть кода, которая вызывает SendInput: (это класс С#, экспортированный в powershell)
public static void SendKeyboard(char ch) {
lpInput[] KeyInputs = new lpInput[1];
lpInput KeyInput = new lpInput();
// Generic Keyboard Event
KeyInput.type = InputType.INPUT_KEYBOARD;
KeyInput.Data.ki.time = 0;
KeyInput.Data.ki.dwExtraInfo = UIntPtr.Zero;
short key = VkKeyScan(ch);
uint mappedKey = MapVirtualKey( LoByte( key ), 0 );
// Push the correct key
KeyInput.Data.ki.wVk = 0;
KeyInput.Data.ki.wScan = (Int16)mappedKey;
KeyInput.Data.ki.dwFlags = KEYEVENTF.SCANCODE;
KeyInputs[0] = KeyInput;
SendInput(1, KeyInputs, lpInput.Size);
// Release the key
KeyInput.Data.ki.dwFlags = KEYEVENTF.SCANCODE | KEYEVENTF.KEYUP;
KeyInputs[0] = KeyInput;
SendInput(1, KeyInputs, lpInput.Size);
return;
}
Спасибо всем! Я надеюсь, что кто-то может помочь мне ;)