2017-08-31 201 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 –

相關問題