Java NativeKeyListener 无法在另一个应用程序中工作

问题描述 投票:0回答:1

我有一个 Java swing 应用程序,其中需要使用 Windows、Mac 和 Linux 操作系统的全局键盘输入键。为此,我决定使用 jnativehook 库 版本:“2.1.0”,因为据说它允许您执行此操作。

目标是当您位于另一个应用程序(即魔兽争霸III)的窗口内时捕获键盘上的按键。

这段代码效果很好,启动应用程序后,键盘按下的按钮、鼠标和鼠标移动的数据都显示在控制台中。

这里是它在 Notepad++ 中如何工作的示例。代码本身将在问题末尾显示如下:

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

更新jnativehook在焦点对准时也不适用于Total Commander窗口。

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

这是我尝试使用的示例代码,取自官方来源

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());
    }
}

问题:当魔兽争霸III应用程序处于焦点状态时,为什么jnativehook停止工作?事实证明,当 Total Commander 窗口处于焦点状态时,也会出现同样的情况。但当它处于焦点状态时,它可以在 Notepad ++ 中工作。它是否有选择性地起作用?

请告诉我可能是什么问题。我的操作系统是 Windows 10。

提前感谢您的建议。

java swing java-native-interface jna jnativehook
1个回答
0
投票

几年前,我在 Dota 地图上为 Invoker 制作了它。 我曾经捕获按键并调度每个组合键序列。 今天,我回到这个想法,为另一款游戏开发作弊程序,但我被困在从另一个窗口捕获事件的过程中。

我没有旧代码,我正在努力捕捉这个事件......

© www.soinside.com 2019 - 2024. All rights reserved.