2011-05-30 69 views
1

我有計劃在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)。可能的解決方案是在我看來一些功能的「重置」,所以它會等待再次按鍵並再次返回258258 ==等待)。但我不知道如何做到這一點。

如果有人知道,如何做到這一點,或者有另一種解決方案,我會感激任何信息。

回答

1

我不知道JNA解決方案,但有一個名爲JIntelliType

編輯一套行之有效的全局熱鍵庫:答對這個問題是使用GetMessage函數,而不是MsgWaitForMultipleObjects。我用BridJ寫了一個簡單的例子,它的效果很好:

 if (!RegisterHotKey(null, id, MOD_ALT | MOD_NOREPEAT, 0x42)) { 
      System.out.println("Error"); 
      return; 
     } 

     Pointer<MSG> msgPointer = Pointer.allocate(MSG.class); 

     try { 
      while (GetMessage(msgPointer, null, 0, 0) != 0) { 
       MSG msg = msgPointer.get(); 
       if (msg.message() == WM_HOTKEY && msg.wParam() == id) { 
        System.out.println("YEAH"); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      UnregisterHotKey(null, id); 
     } 
+0

第一次測試JIntelliType後,我不得不說我很滿意。與這個庫工作看起來很吝嗇,它似乎工作正常。謝謝。 – James 2011-05-30 12:57:46

+0

@James:如果您仍然對JNA解決方案感興趣,請參閱我的編輯:使用GetMessage應該使您的代碼正常工作。 – 2011-06-07 17:20:35

+0

謝謝,但我現在完全滿意JIntellyType。 – James 2011-06-07 23:46:14