Java系统范围的键盘快捷键[关闭]
题
有没有什么办法让一个全系统的(全球)的键盘快捷方式 执行Java应用程序的动作?
任何AWT / Swing的绑定?
解决方案
有没有,但在Windows中可以使用这样的:
不幸的是,没有任何我所知道的用于Linux和OSX,也许这就是为什么它不使用Java来开箱即用的。
如果您发现了其他平台后在这里请:)
只是为了couriosity,你有什么与做什么?
其他提示
我JIntellitype的作者,我可以告诉你这必须在本地DLL来实现,并呼吁从Java JNI就像JIntellitype确实是一个事实。这是未在JDK实现,从而像JIntellitype和jxGrabKey库必须使用的OS水平钩。据我所知,没有人写过一个OSX呢。
JIntellitype是在Github开源的,所以如果你想它如何工作只是检查出源<一个想法/ A>码
我刚发现 https://github.com/kwhat/jnativehook
似乎是跨平台。
下面是他们的示例代码监听按键:
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
public class GlobalKeyListenerExample implements NativeKeyListener {
public void nativeKeyPressed(NativeKeyEvent e) {
System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
GlobalScreen.unregisterNativeHook();
}
}
public void nativeKeyReleased(NativeKeyEvent e) {
System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}
public void nativeKeyTyped(NativeKeyEvent e) {
System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
}
public static void main(String[] args) {
try {
GlobalScreen.registerNativeHook();
}
catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage());
System.exit(1);
}
GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample());
}
}
检查修饰符是基于位掩码(东西大家应该都知道,但总是忘了:-P):
boolean isAltPressed = (e.getModifiers() & NativeKeyEvent.ALT_MASK) != 0;
boolean isShiftPressed = (e.getModifiers() & NativeKeyEvent.SHIFT_MASK) != 0;
这你可以用邀请码组合:
if (e.getKeyCode() == NativeKeyEvent.VK_2 && isShiftPressed && isAltPressed){...}
此从这里变形例
您也应该修改默认的日志记录行为,否则将垃圾邮件的控制台:
// Get the logger for "org.jnativehook" and set the level to warning.
Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName());
logger.setLevel(Level.WARNING);
// Don't forget to disable the parent handlers.
logger.setUseParentHandlers(false);
代码的例子是从此处
更新:我不知道,如果你可以连接来自外部的JVM的事件。我认为一个Swing / AWT组件必须具有焦点,这个工作。
您会希望在Java AWT事件队列挂钩,以绝对确保你可以得到一个全局(JVM宽)按键。
使用
EventQueue ev = Toolkit.getSystemEventQueue();
// MyCustomEventQueue extends EventQueue and processes keyboard events in the dispatch
ev.push(new MyCustomEventQueue());
class MyEventQueue extends EventQueue
{
protected void dispatchEvent(AWTEvent event)
{
// all AWTEvents can be indentified by type, KeyEvent, MouseEvent, etc
// look for KeyEvents and match against you hotkeys / callbacks
}
}
我想可能还有其他的方式来完成与行动地图全球按键。我已经实际使用的上述mether
对于Windows,你需要一个键盘钩子的DLL。 您可以从Java初始化您的DLL,这将导致其注册的监听器。 你会得到你所需要的。检查MSDN的DLL挂钩,或键盘钩子。其中之一应该设置你。
有关Linux的我想这应该是比较容易的,但我从来没有这样做我自己。
http://ubuntuforums.org/showthread.php?t=864566
谷歌的第一个结果的“Linux监听全球按键”(不含引号)变成了一些东西,我认为这将有助于你出去X11环境
OSX可能只是能够用接近一个解决方案。 但最终,你可能需要一个DLL的每个平台,除非JNA可以这样做没有问题,那么最坏完成。
JDIC(Java桌面集成)可以帮助点击 的 https://jdic.dev.java.net/ 强>
似乎是一点点没有维护我。我不知道。结果 如果有人知道更多,请报告!点击 我也是在这个功能很感兴趣。