我正尝试追上鼠标/键盘事件用Java(FX),即使应用程序窗口isn't集中 ... I'm创造一些像screenrecorder,我想停止录制通过按像“F9”这样的键,所以我需要检测事件。这可能吗? 有没有像系统监听器我可以使用?JavaFX:如何在屏幕上的任何位置检测鼠标/按键事件?
〜亨利
我正尝试追上鼠标/键盘事件用Java(FX),即使应用程序窗口isn't集中 ... I'm创造一些像screenrecorder,我想停止录制通过按像“F9”这样的键,所以我需要检测事件。这可能吗? 有没有像系统监听器我可以使用?JavaFX:如何在屏幕上的任何位置检测鼠标/按键事件?
〜亨利
不幸的是,你不能这样做。 JavaFX需要一个专注的窗口。出于安全目的,对于操作系统的控制很少,没有简单的方法可以实现您想要的Java。最好的做法是编写一个C应用程序来执行此操作,然后使用JNI从Java钩入它。
你会想做两件事。
编写一个C程序,用于监听OS上的全局事件。对于Windows,您可以在MSDN上找到关于此的更多信息,对于mac和linux,您将需要使用X11库。
使用JNI将您的C代码链接到Java中。这并不像听起来那么困难,这里是它一个很好的教程:https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
当然,你不必做这一切工作的自己,也有刚才的一切进出库那里。这个库为你努力工作,你可以用它来实现你的目标:https://github.com/kwhat/jnativehook
非常感谢:D –
这是可能的,但是如果注册的组件没有焦点,标准的Java不能访问击键或鼠标事件。
为了达到此目的,您需要通过Java本机接口(JNI)使用本机代码。这使得Java代码可以调用本地应用程序(特定于硬件和操作系统平台的程序)以及用其他语言(如C和C++)编写的库。
幸运的是,有一个第三方库JNativeHook这是专为您所需要的设计。你可以在这里找到它:https://github.com/kwhat/jnativehook
如果你使用Maven进行依赖管理,你可以很容易地安装它。这是一个工作示例:
App.java
package com.sotest.globalkeylistener;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
public class App
{
public static void main(String[] args) {
try {
GlobalScreen.registerNativeHook();
}
catch (NativeHookException ex) {
System.exit(1);
}
GlobalScreen.addNativeKeyListener(new GlobalKeyListener());
}
}
GlobalKeyListener.java
package com.sotest.globalkeylistener;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
public class GlobalKeyListener 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 e1) {
e1.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()));
}
}
鼠标输出
即使您的Java应用程序被最小化,也可以通过这种方式检测事件。
希望这会有所帮助。
非常感谢:DI现在尝试一下c: –
您可能还需要此答案来包装JavaFX事件:https://stackoverflow.com/questions/45403575/making-games-with -jnativehook/45423466#45423466 –
不,它并不是我想要的。 –
@ JavaProgrammer.002刚刚发布了一个答案,这是一个快速简单的方法来做你需要的。只需将库添加为依赖项,您就可以轻松完成任务。 – Aph