Отправка нажатий клавиш в скрытое окно через JNA - PullRequest
0 голосов
/ 11 июня 2019

Фон:

Я посылаю нажатия клавиш в программу (текстовый редактор), которую я скрываю, а затем отправляю клавишу F7 и после этого четыре клавиши текста (вид пароля)).Я использую JNA Library и функцию SendMessage Win32API для отправки сообщений, не могу использовать sendInput (), потому что мне нужно отправить на определенный дескриптор окна.

Код:

private static void sendInputToWindow(WinDef.HWND editorWindowHandle, char[] password) throws InterruptedException {
        User32.INSTANCE.ShowWindow(editorWindowHandle, WinUser.SW_HIDE);
        User32.INSTANCE.SetForegroundWindow(editorWindowHandle);
        User32.INSTANCE.SetFocus(editorWindowHandle);

        //F7 KEY SENT
        WinDef.WPARAM wparam = new WinDef.WPARAM(F7_VIRTUAL_KEY);
        WinDef.LPARAM lparam = new WinDef.LPARAM(0);
        log.debug("SENDING F7");
        User32.INSTANCE.SendMessage(editorWindowHandle, WinUser.WM_KEYDOWN, wparam, lparam);
        Thread.sleep(1000);
        log.debug("SENDING PASSWORD");
        // PASSWORD SENT
        User32.INSTANCE.SendMessage(editorWindowHandle, WinUser.WM_CHAR, new WinDef.WPARAM(password[0]), lparam);
        User32.INSTANCE.SendMessage(editorWindowHandle, WinUser.WM_CHAR, new WinDef.WPARAM(password[1]), lparam);
        User32.INSTANCE.SendMessage(editorWindowHandle, WinUser.WM_CHAR, new WinDef.WPARAM(password[2]), lparam);
        User32.INSTANCE.SendMessage(editorWindowHandle, WinUser.WM_CHAR, new WinDef.WPARAM(password[3]), lparam);
        Thread.sleep(500);
        log.debug("SENDING ENTER");
        // ENTER KEY SENT
        User32.INSTANCE.SendMessage(editorWindowHandle, WinUser.WM_KEYDOWN, new WinDef.WPARAM(ENTER_KEY), lparam);
    }

Проблема:

Когда я посылаю нажатия клавиш через SendMessage, через некоторое время или случайным образом (я не знаю, что является причиной проблемы здесь), но иногда этоне отправляет нажатия клавиш вообще!

Таким образом, это ситуация попадания или пропуска, в большинстве случаев она посылает нажатия клавиш, а в других - нет.Интересно, есть ли лучший способ отправить нажатия клавиш в скрытое окно?или если я здесь что-то не так делаю.

Спасибо.

1 Ответ

1 голос
/ 13 июня 2019

Как указано в комментарии, SendInput является наиболее поддерживаемым.

Я попытался использовать его в консоли Win32 и обнаружил, что он работает очень хорошо.Код выглядит следующим образом.

#include <iostream>
#include <Windows.h>

int main()
{
    INPUT input[5];
    memset(input, 0, sizeof(input));

    input[0].type = input[1].type = input[2].type = input[3].type = input[4].type = INPUT_KEYBOARD; 
    SetForegroundWindow((HWND)0x000A09D8);//EDIT EDITOR HANDLE

    while (1)
    {       
        input[0].ki.wVk = '1';
        input[1].ki.wVk = '2';
        input[2].ki.wVk = '3';
        input[3].ki.wVk = '4';
        input[4].ki.wVk = VK_RETURN;

        SendInput(5, input, sizeof(INPUT));
        std::cout << GetLastError() << std::endl;
        Sleep(1000);
        input[0].ki.dwFlags = input[1].ki.dwFlags = input[2].ki.dwFlags = input[3].ki.dwFlags = input[4].ki.dwFlags = KEYEVENTF_KEYUP;
        SendInput(5, input, sizeof(INPUT));
        input[0].ki.dwFlags = input[1].ki.dwFlags = input[2].ki.dwFlags = input[3].ki.dwFlags = input[4].ki.dwFlags = 0;
        std::cout << GetLastError() << std::endl;
        Sleep(1000);
    }

    return 0;
}

print

...