Окно игнорирует клавишу SendInput

Я пытаюсь автоматизировать вставку некоторых данных в программное обеспечение. Это программное обеспечение имеет всплывающее окно, требующее ввода пароля с текстовым полем и кнопкой 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;
}

Спасибо всем! Я надеюсь, что кто-то может помочь мне ;)


person Mix Kira    schedule 02.06.2016    source источник