我正嘗試追上鼠標/鍵盤事件用Java(FX),即使應用程序窗口isn't集中 ... I'm創造一些像screenrecorder,我想停止錄製通過按像「F9」這樣的鍵,所以我需要檢測事件。這可能嗎? 有沒有像系統監聽器我可以使用?JavaFX:如何在屏幕上的任何位置檢測鼠標/按鍵事件?
〜亨利
我正嘗試追上鼠標/鍵盤事件用Java(FX),即使應用程序窗口isn't集中 ... I'm創造一些像screenrecorder,我想停止錄製通過按像「F9」這樣的鍵,所以我需要檢測事件。這可能嗎? 有沒有像系統監聽器我可以使用?JavaFX:如何在屏幕上的任何位置檢測鼠標/按鍵事件?
〜亨利
不幸的是,你不能這樣做。 JavaFX需要一個專注的窗口。出於安全目的,對於操作系統的控制很少,沒有簡單的方法可以實現您想要的Java。最好的做法是編寫一個C應用程序來執行此操作,然後使用JNI從Java鉤入它。
你會想做兩件事。
編寫一個C程序,用於監聽OS上的全局事件。對於Windows,您可以在MSDN上找到關於此的更多信息,對於mac和linux,您將需要使用X11庫。
使用JNI將您的C代碼鏈接到Java中。這並不像聽起來那麼困難,這裏是它一個很好的教程:https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
當然,你不必做這一切工作的自己,也有剛纔的一切進出庫那裏。這個庫爲你努力工作,你可以用它來實現你的目標:https://github.com/kwhat/jnativehook
非常感謝:D –
這是可能的,但是如果註冊的組件沒有焦點,標準的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應用程序被最小化,也可以通過這種方式檢測事件。
希望這會有所幫助。
非常感謝:DI現在嘗試一下c: –
您可能還需要此答案來包裝JavaFX事件:https://stackoverflow.com/questions/45403575/making-games-with -jnativehook/45423466#45423466 –
不,它並不是我想要的。 –
@ JavaProgrammer.002剛剛發佈了一個答案,這是一個快速簡單的方法來做你需要的。只需將庫添加爲依賴項,您就可以輕鬆完成任務。 – Aph