运维开发网

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

运维开发网 https://www.qedev.com 2020-04-10 09:44 出处:网络 作者:运维开发网整理
我试图用 Java(fx)捕获鼠标/键事件,即使应用程序窗口没有集中…… 我正在创建类似于screenrecorder的东西,我想通过按“F9”之类的键来停止录制,所以我需要检测事件.这可能吗? 有没有像我可以使用的系统监听器? 〜亨利 这是可能的,但如果注册的组件不在焦点,则标准Java无法访问键击或鼠标事件. 为了实现这一点,您需要通过Java Native Interface(JNI)使用本
我试图用 Java(fx)捕获鼠标/键事件,即使应用程序窗口没有集中……

我正在创建类似于screenrecorder的东西,我想通过按“F9”之类的键来停止录制,所以我需要检测事件.这可能吗?

有没有像我可以使用的系统监听器?

〜亨利

这是可能的,但如果注册的组件不在焦点,则标准Java无法访问键击或鼠标事件.

为了实现这一点,您需要通过Java Native Interface(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()));
    }
}

关键输出:

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

鼠标输出

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

这样,即使Java应用程序已最小化,您也可以检测到该事件.

希望这可以帮助.

0

精彩评论

暂无评论...
验证码 换一张
取 消