JavaFX:如何在屏幕上的任何位置检测鼠标/按键事件?
我试图在Java(fx)中捕捉鼠标/按键事件,即使应用程序窗口没有聚焦。。。 我正在创建一个类似于屏幕录制器的东西,我想通过按类似于“F9”的键来停止录制,所以我需要检测事件。这可能吗? 是否有类似于系统侦听器的东西可以使用JavaFX:如何在屏幕上的任何位置检测鼠标/按键事件?,java,events,javafx,system,listeners,Java,Events,Javafx,System,Listeners,我试图在Java(fx)中捕捉鼠标/按键事件,即使应用程序窗口没有聚焦。。。 我正在创建一个类似于屏幕录制器的东西,我想通过按类似于“F9”的键来停止录制,所以我需要检测事件。这可能吗? 是否有类似于系统侦听器的东西可以使用 ~Henri不幸的是,你不能这样做。JavaFX需要一个聚焦窗口。用Java实现您想要的目标并不容易,因为出于安全目的,它对操作系统的控制非常有限。最好的做法是编写一个C应用程序来实现这一点,然后使用JNI从Java钩住它 你会想做两件事 编写一个C程序,侦听操作系统上的全
~Henri不幸的是,你不能这样做。JavaFX需要一个聚焦窗口。用Java实现您想要的目标并不容易,因为出于安全目的,它对操作系统的控制非常有限。最好的做法是编写一个C应用程序来实现这一点,然后使用JNI从Java钩住它 你会想做两件事
当然,你不必自己做所有的工作,那里有图书馆,几乎可以存放所有的东西。这个库为您完成了艰苦的工作,您可以使用它来实现您的目标:这是可能的,但是如果注册的组件不在焦点中,标准Java无法访问按键或鼠标事件 为了实现这一点,您需要通过Java本机接口(JNI)使用本机代码。这使得java代码能够调用本地应用程序(特定于硬件和操作系统平台的程序)和用C语言和C++语言编写的库。 幸运的是,有一个第三方库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应用程序最小化,也可以检测事件
希望这能有所帮助。不,这不是我想归档。@JavaProgrammer.002刚刚发布了一个答案,这是一个快速简便的方法,可以满足您的需要。只需将库添加为依赖项,就可以了。您可能还需要以下答案来包装JavaFX事件: