2008-10-01 56 views
4

我正在開發與java的屏幕上的鍵盤。該鍵盤的每個可能鍵都有JComponent。當在按鈕上檢測到鼠標向下時,我想向當前處於焦點的應用程序發送特定的鍵盤代碼。鍵盤本身在沒有裝飾的JFrame內,並且始終位於頂部。從java發送鍵盤事件到任何應用程序(屏幕上的鍵盤)

我發現Robot類可以用來在本地隊列上模擬這些鍵盤事件。但是,在這種情況下,選擇JComponent將意味着在JFrame上收到按鍵,並且我無法在其他應用程序中收到該按鍵

如何保持我的屏幕鍵盤「始終不爲關注焦點「?是否有可能使用另一種方法發送按鍵?

回答

2

顯然,唯一的方法是創建一個JNI圖層,它將從java轉換爲本地圖層。 Java沒有簡單的方法來提供這種funcionality。

這可能是一個小的,第三方庫的人誰願意學習JNI一個有趣的概念...

0

在使用機器人類之前,您是否嘗試調用本機setfocus()或setactivewindow()函數來移動焦點?

1

我能找到到目前爲止,唯一的解決辦法,是讓每一個鍵一個JComponent(所以它不能具有焦點),並設置上的JFrame以下屬性:使用機器人時

setUndecorated(true); 
    setFocusableWindowState(false); 
    setFocusable(false); 
    enableInputMethods(false); 

現在我可以通過點擊鍵將事件發送到任何聚焦的窗口。唯一的限制是,它似乎只適用於屬於同一個虛擬機的Windows,並且根本不能與任何其他系統窗口一起工作。

+0

在windows 10上完美工作,應該是第一個答案,不需要jni – 2017-08-14 18:26:50

0

我不知道有任何方式以獨立於操作系統的方式執行此操作。我不知道Windows,但可能會通過X協議與X服務器通話。

3

我發現jnativehook當我試圖控制與實際的鍵盤和鼠標命令的gamebot(以更像「人性化」)。

+0

從JNativeHook的描述來看,它好像是用於*監聽鍵盤和鼠標事件,而不是用於將事件發送到另一個應用程序。 – 2016-06-02 21:36:10