当前位置: 首页 > 知识库问答 >
问题:

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

司空坚
2023-03-14

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

~亨利

共有1个答案

吕霍英
2023-03-14

这是可能的,但如果注册的组件不在焦点中,标准的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应用程序最小化,你也可以检测到事件。

希望这有帮助。

 类似资料:
  • 我想让我的应用程序检测鼠标点击在屏幕上的任何地方,而不必使应用程序聚焦。我想要它检测鼠标事件普遍,即使它最小化。到目前为止,我只能在swing GUI中检测鼠标事件。 Autohotkey可以随时检测鼠标点击并获得鼠标的位置,用Java怎么做到这一点呢?

  • 问题内容: 我敢肯定这是可能的,但是我所有的搜索都空白了。 在Java中,是否可以在Java应用程序之外注册鼠标移动事件?因此,如果鼠标指针移动到屏幕上的任何地方,我都会回电。轮询可能是近似值,但必须有更好的方法。 谢谢 解释用例:它仅用于一个宠物项目,但是基本上是当鼠标击中屏幕边缘时触发事件。我还认为,如果您尝试 超越 屏幕边缘,可能会触发其他事件。为此,我认为鼠标运动侦听器可能更合适。 问题答

  • 问题内容: 是否可以检测到我的应用程序之外屏幕上任何地方的鼠标单击? 我已经用C#编写了一个应用程序来执行此操作,但是我想用Java编写一个该程序的版本,以便它可以在多个平台上运行。 看起来我可以随时获取鼠标的坐标,但是我不确定如何监听鼠标的单击。 在C#中,我曾经检测过是否单击了鼠标按钮,但是如果我希望保持“干净”以便在多个平台上使用,显然就不能使用它。 问题答案: 您只能通过特定平台的OS A

  • 我有一个JavaFX应用程序,我想为场景中任何地方的鼠标单击添加一个事件处理程序。下面的方法可以工作,但不完全按照我想要的方式。这里有一个例子来说明问题: 如果单击空空间中的任何位置,将调用方法,但如果单击,则不会调用方法。在我的应用程序中有许多按钮和其他交互元素,因此我需要一种方法来捕获对这些元素的点击,而不必为每个元素手动添加新的处理程序。

  • 问题内容: 我正在开发JavaFX项目,并且需要类似于表征 “按下并按住”事件的东西 。但是应该将其映射为一个,因为我在Linux上的触摸事件遇到了麻烦。例如,在Ubuntu中,它不会响应触摸事件。 请让我知道,如果你对如何触发一个任何想法 每当 “按住” 在Linux上出现? 问题答案: 只需将a 用作“保持”的计时器即可。如果按下鼠标,则将其启动;如果释放或拖动,则将其停止。

  • 所以我开始在我的应用程序中为不同的功能设置键,我想知道是否有一种方法可以设置鼠标左键或右键来执行某些操作?我在keycode.java中找不到任何鼠标事件,我不知道如何应用它。 下面是我的代码: 我要完成的是使右键点击你的鼠标按钮停止移动,左键点击再次开始。我该怎么做?谢谢你。