Java NativeKeyListener不';不能在另一个应用程序中工作

Java NativeKeyListener不';不能在另一个应用程序中工作,java,swing,java-native-interface,jna,jnativehook,Java,Swing,Java Native Interface,Jna,Jnativehook,我有一个JavaSwing应用程序,在这个应用程序中,需要为Windows、Mac和Linux操作系统使用全局键盘输入键。为此,我决定使用“2.1.0”版本,因为据说它允许您这样做 目标是在另一个应用程序(即魔兽争霸III的窗口中,捕捉键盘上的按键 这段代码工作得很好,启动应用程序后,键盘、鼠标和鼠标移动按钮上的数据显示在控制台中 下面是它如何在Notepad++中工作的示例。问题结束时,代码本身将显示在下面: 但问题是,当魔兽争霸III应用程序处于聚焦状态且处于活动状态时,当您按键、鼠标并移

我有一个JavaSwing应用程序,在这个应用程序中,需要为Windows、Mac和Linux操作系统使用全局键盘输入键。为此,我决定使用“2.1.0”版本,因为据说它允许您这样做

目标是在另一个应用程序(即魔兽争霸III的窗口中,捕捉键盘上的按键

这段代码工作得很好,启动应用程序后,键盘、鼠标和鼠标移动按钮上的数据显示在控制台中

下面是它如何在Notepad++中工作的示例。问题结束时,代码本身将显示在下面:

但问题是,当魔兽争霸III应用程序处于聚焦状态且处于活动状态时,当您按键、鼠标并移动鼠标时,什么都不会发生。我的所有活动都不会显示在应用程序控制台中

更新jnativehook在处于焦点状态时,也不适用于Total Commander窗口

这就是魔兽争霸III应用程序在以管理员身份运行的窗口模式下的外观。

以下是我尝试使用的示例代码,摘自:

问题:为什么jnativehook在​​魔兽争霸III应用程序受到关注?事实证明,当“总司令”窗口处于焦点位置时,情况也是如此。但当它处于焦点时,它在Notepad++中工作。它是否有选择性地工作

请告诉我有什么问题。我的操作系统是Windows10


提前感谢您的建议。

请不要发布问题的副本。编辑原始的已关闭问题,以便可以重新打开。@DanielWiddis抱歉,我是新来的。我已经删除了旧问题。这可能是权限问题吗?谁是魔兽争霸流程的所有者?在魔兽争霸密钥绑定优先的情况下,是否存在重复密钥绑定的可能性?@DanielWiddis单击JFrame中的(“玩魔兽争霸III”)按钮后,war3.exe(魔兽争霸III)进程开始。此进程启动时没有挂钩。这是很难复制的,因为不是每个人都安装了这个游戏。但是你可以试着用Total Commander复制它。我的意思是在运行代码后,打开Total Commander和keyhook在Total Commander处于焦点时将无法工作。我甚至不知道现在该怎么办。我读到有必要使用User32.LowLevelKeyboardProc()来实现低级别全局密钥侦听器,而不管哪个应用程序处于焦点位置
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

public class GlobalKeyListenerExample implements NativeKeyListener {
    public void nativeKeyPressed(NativeKeyEvent e) {
        System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));

        if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
            try {
                GlobalScreen.unregisterNativeHook();
            } catch (NativeHookException nativeHookException) {
                nativeHookException.printStackTrace();
            }
        }
    }

    public void nativeKeyReleased(NativeKeyEvent e) {
        System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
    }

    public void nativeKeyTyped(NativeKeyEvent e) {
        System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
    }

    public static void main(String[] args) {
        try {
            GlobalScreen.registerNativeHook();
        } catch (NativeHookException ex) {
            System.err.println("There was a problem registering the native hook.");
            System.err.println(ex.getMessage());

            System.exit(1);
        }

        GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample());
    }
}