我有计划在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