簡體   English   中英

JavaFX:如何檢測屏幕上任何位置的鼠標/按鍵事件?

[英]JavaFX: How to detect mouse/key events anywhere on screen?

我正在嘗試在 Java(fx) 中捕獲鼠標/鍵事件,即使應用程序窗口沒有聚焦......我正在創建類似屏幕記錄器的東西,我想通過按“F9”之類的鍵來停止錄制" ,所以我需要檢測事件。 這可能嗎? 有沒有我可以使用的系統監聽器之東西?

~亨利

如果注冊的組件不在焦點上,這是可能的,但標准 Java 無法訪問按鍵或鼠標事件。

為了實現這一點,您需要通過Java 本機接口 (JNI)使用本機代碼。 這使 Java 代碼能夠調用本機應用程序(特定於硬件和操作系統平台的程序)和用其他語言(如 C 和 C++)編寫的庫。

幸運的是,有一個第三方庫JNativeHook專為您的需要而設計。 你可以在這里找到它: https : //github.com/kwhat/jnativehook

如果您使用 Maven 進行依賴管理,您可以輕松安裝它。 這是一個工作示例:

應用程序.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());
    }
}

全局鍵監聽器

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 應用程序被最小化,您也可以檢測到事件。

希望這會有所幫助。

不幸的是,您不能這樣做。 JavaFX 需要一個聚焦窗口。 沒有簡單的方法可以使用 Java 實現您想要的目標,因為出於安全目的,它使您幾乎無法控制操作系統。 最好的辦法是編寫一個 C 應用程序來執行此操作,然后使用 JNI 從 Java 中掛鈎到它。

你會想做兩件事。

  1. 編寫一個 C 程序來偵聽操作系統上的全局事件。 對於 Windows,您可以在 MSDN 上找到有關此內容的更多信息,對於 mac 和 linux,您將需要使用 X11 庫。

  2. 使用 JNI 在 Java 中鏈接您的 C 代碼。 這並不像聽起來那么難,這里有一個很好的教程: https : //www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

當然,你不必自己做所有的工作,那里有幾乎所有東西的庫。 這個庫為你完成了艱苦的工作,你可以用它來實現你的目標: https : //github.com/kwhat/jnativehook

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM