我有一个 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());
}
}
问题:为什么jnativehook在魔兽争霸III应用处于焦点时停止工作?事实证明,同样的情况是当Total Commander窗口处于焦点时。但是当它处于焦点时,它可以在记事本++中工作。它是否以某种方式选择性地工作?
请告诉我可能是什么问题。我的操作系统是 Windows 10。
预先感谢您的建议。