2017-08-31 199 views
2

我正尝试追上鼠标/键盘事件用Java(FX),即使应用程序窗口isn't集中 ... I'm创造一些像screenrecorder,我想停止录制通过按像“F9”这样的键,所以我需要检测事件。这可能吗? 有没有像系统监听器我可以使用?JavaFX:如何在屏幕上的任何位置检测鼠标/按键事件?

〜亨利

+0

不,它并不是我想要的。 –

+1

@ JavaProgrammer.002刚刚发布了一个答案,这是一个快速简单的方法来做你需要的。只需将库添加为依赖项,您就可以轻松完成任务。 – Aph

回答

1

不幸的是,你不能这样做。 JavaFX需要一个专注的窗口。出于安全目的,对于操作系统的控制很少,没有简单的方法可以实现您想要的Java。最好的做法是编写一个C应用程序来执行此操作,然后使用JNI从Java钩入它。

你会想做两件事。

  1. 编写一个C程序,用于监听OS上的全局事件。对于Windows,您可以在MSDN上找到关于此的更多信息,对于mac和linux,您将需要使用X11库。

  2. 使用JNI将您的C代码链接到Java中。这并不像听起来那么困难,这里是它一个很好的教程:https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

当然,你不必做这一切工作的自己,也有刚才的一切进出库那里。这个库为你努力工作,你可以用它来实现你的目标:https://github.com/kwhat/jnativehook

+0

非常感谢:D –

4

这是可能的,但是如果注册的组件没有焦点,标准的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())); 
    } 
} 

主要输出: Global key listener output

鼠标输出

Global mouse listener output

即使您的Java应用程序被最小化,也可以通过这种方式检测事件。

希望这会有所帮助。

+0

非常感谢:DI现在尝试一下c: –

+0

您可能还需要此答案来包装JavaFX事件:https://stackoverflow.com/questions/45403575/making-games-with -jnativehook/45423466#45423466 –

相关问题