2011-05-30 71 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