Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX:如何在屏幕上的任何位置检测鼠标/按键事件?_Java_Events_Javafx_System_Listeners - Fatal编程技术网

JavaFX:如何在屏幕上的任何位置检测鼠标/按键事件?

JavaFX:如何在屏幕上的任何位置检测鼠标/按键事件?,java,events,javafx,system,listeners,Java,Events,Javafx,System,Listeners,我试图在Java(fx)中捕捉鼠标/按键事件,即使应用程序窗口没有聚焦。。。 我正在创建一个类似于屏幕录制器的东西,我想通过按类似于“F9”的键来停止录制,所以我需要检测事件。这可能吗? 是否有类似于系统侦听器的东西可以使用 ~Henri不幸的是,你不能这样做。JavaFX需要一个聚焦窗口。用Java实现您想要的目标并不容易,因为出于安全目的,它对操作系统的控制非常有限。最好的做法是编写一个C应用程序来实现这一点,然后使用JNI从Java钩住它 你会想做两件事 编写一个C程序,侦听操作系统上的全

我试图在Java(fx)中捕捉鼠标/按键事件,即使应用程序窗口没有聚焦。。。 我正在创建一个类似于屏幕录制器的东西,我想通过按类似于“F9”的键来停止录制,所以我需要检测事件。这可能吗? 是否有类似于系统侦听器的东西可以使用


~Henri

不幸的是,你不能这样做。JavaFX需要一个聚焦窗口。用Java实现您想要的目标并不容易,因为出于安全目的,它对操作系统的控制非常有限。最好的做法是编写一个C应用程序来实现这一点,然后使用JNI从Java钩住它

你会想做两件事

  • 编写一个C程序,侦听操作系统上的全局事件。对于Windows,您可以在MSDN上找到更多关于此的信息,对于mac和linux,您需要使用X11库

  • 使用JNI链接Java中的C代码。这并不像听起来那么难,这里有一个很好的教程:


  • 当然,你不必自己做所有的工作,那里有图书馆,几乎可以存放所有的东西。这个库为您完成了艰苦的工作,您可以使用它来实现您的目标:

    这是可能的,但是如果注册的组件不在焦点中,标准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事件: