我有計劃在Windows下運行的Java程序,可以在不同的鍵runnig上映射不同的「宏」在後臺。問題是 - 如何讓Java監聽在應用程序未被關注時按下的按鍵。使用JNA的「全局」KeyListener
我發現很多意見認爲這是不可能的。但我也在SO上發現了Stefano寫的this。這個解決方案對我來說還不夠好,至少沒有一個重要的信息。如果沒有按下鍵,功能MsgWaitForMultipleObjects()
會返回一個值...沒關係。按下按鍵後,它會返回不同的值......如果該按鍵事件發生後,該功能不會返回相同的值。
這裏是線程測試此:
public class KeyListener extends Thread {
/**
* Constructor
*/
public KeyListener() {
super();
}
/**
* RUN method
*/
@Override
public void run() {
int x;
User32 user32 = User32.INSTANCE;
boolean res = user32.RegisterHotKey(Pointer.NULL, 1, User32.MOD_ALT | User32.MOD_CONTROL, WinKeys.VK_X);
if (!res) {
System.out.println("Couldn't register hotkey");
}
System.out.println("Starting and waiting");
while (!isInterrupted()) {
x = user32.MsgWaitForMultipleObjects(0, Pointer.NULL, true, 1000, User32.QS_HOTKEY);
if (x == 0) {
System.out.println("Key pressed");
}
}
}
}
這個小程序(使用此線程)反應在按下ALT+X
。按下後,文本Key pressed
被寫出到控制檯,直到程序停止(該函數始終返回0)。可能的解決方案是在我看來一些功能的「重置」,所以它會等待再次按鍵並再次返回258
(258
==等待)。但我不知道如何做到這一點。
如果有人知道,如何做到這一點,或者有另一種解決方案,我會感激任何信息。
第一次測試JIntelliType後,我不得不說我很滿意。與這個庫工作看起來很吝嗇,它似乎工作正常。謝謝。 – James 2011-05-30 12:57:46
@James:如果您仍然對JNA解決方案感興趣,請參閱我的編輯:使用GetMessage應該使您的代碼正常工作。 – 2011-06-07 17:20:35
謝謝,但我現在完全滿意JIntellyType。 – James 2011-06-07 23:46:14