java - 通过 JNA 将击键发送到隐藏窗口

标签 java windows winapi jna

背景:

我将击键发送到隐藏的程序(文本编辑器),然后发送 F7 键,然后发送四个文本键(类似于密码)。我使用 JNA 库和 Win32API 的 SendMessage 函数来发送消息,不能使用 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 发送击键时,在一段时间后或随机地(我不知道是什么导致了这里的问题),但有时它根本不发送击键!

所以这是一个命中或未命中的情况,大多数时候它会发送击键,而其他时候则不会。我想知道是否有更好的方法将击键发送到隐藏窗口?或者如果我在这里做错了什么。

谢谢。

最佳答案

正如评论中所述,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

关于java - 通过 JNA 将击键发送到隐藏窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56542792/

相关文章:

javascript - JSP 表单使用 post 传递值

java - 当 postDelayed 处理程序运行时,AsynchTask 卡住

windows - 如何将键盘和鼠标输入发送到 Windows 登录屏幕?

c++ - 如何取消 CFtpConnection::PutFile?

java - 如何修复使用 Thymeleaf 调用 Java 方法?

java - 建议下载和使用 JDK7 吗?

windows - 如何在不使用 "My Computer"对话框的情况下在 Windows XP 中设置系统环境变量

windows - 如何以编程方式检索区域和语言设置中显示的 "Location"?

c++ - 逆向工程 C++ DLL

c++ - 如何通过其 HWND 句柄更改另一个进程中 TDateTimePicker 控件中当前选定的日期?