使用JNA的“全局” KeyListener

| 我正在计划在Windows下运行的Java程序的计划制定工作,该程序可以在背景的不同键runnig上映射差异\“ macros \”。问题是-如何使Java在应用程序未聚焦时监听按键。 我发现很多观点认为这是不可能的。但是我也发现Stefano在SO上写的这本书。这种解决方案对我来说还不够好,至少没有一个重要的信息。如果未按下该键,功能“ 0”将返回一个值。按键后,它会返回不同的值...如果函数在按键事件后不会返回相同的值,则可以。 这是测试的线程:
public class KeyListener extends Thread {

    /**
     * Constructor
     */
    public KeyListener() {
        super();
    }

    /**
     * RUN method
     */
    @Override
    public void run() {
        int x;
        User32 user32 = User32.INSTANCE;

        boolean res = user32.RegisterHotKey(Pointer.NULL, 1, User32.MOD_ALT | User32.MOD_CONTROL, WinKeys.VK_X);
        if (!res) {
            System.out.println(\"Couldn\'t register hotkey\");
        }
        System.out.println(\"Starting and waiting\");

        while (!isInterrupted()) {
            x = user32.MsgWaitForMultipleObjects(0, Pointer.NULL, true, 1000, User32.QS_HOTKEY);

            if (x == 0) {
                System.out.println(\"Key pressed\");
            }
        }
    }
}
这个小程序(使用该线程)在按
ALT+X
时作出反应。按下此键后,将文本“ 3”写到控制台,直到程序停止(该函数始终返回0)。在我看来,可能的解决方案是该功能的某些“复位”,因此它将再次等待按键并再次返回
258
258
==等待)。但是我不知道该怎么做。 如果有人知道如何执行此操作,或者还有其他解决方案,我将不胜感激。     
已邀请:
        我不知道JNA解决方案,但是有一个完善的全局热键库,称为JIntelliType 编辑:此问题的正确答案是使用GetMessage而不是MsgWaitForMultipleObjects。我使用BridJ编写了一个简单的示例,它很好用:
       if (!RegisterHotKey(null, id, MOD_ALT | MOD_NOREPEAT, 0x42)) {
            System.out.println(\"Error\");
            return;
        }

        Pointer<MSG> msgPointer = Pointer.allocate(MSG.class);

        try {
            while (GetMessage(msgPointer, null, 0, 0) != 0) {
                MSG msg = msgPointer.get();
                if (msg.message() == WM_HOTKEY && msg.wParam() == id) {
                    System.out.println(\"YEAH\");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            UnregisterHotKey(null, id);
        }
    

要回复问题请先登录注册