Java系统范围的键盘快捷方式

有没有办法获得系统范围(全局)键盘快捷方式在Java应用程序中执行操作?

任何AWT / Swing绑定?

没有,但在Windows中你可以使用这个:

jintellitype

不幸的是,对于Linux和OSX我没有任何意识,这可能就是为什么它没有开箱即用的java。

如果你发现其他平台发布在这里请:)

只是为了咳嗽,你在做什么呢?

我是JIntellitype的作者,我可以告诉你一个事实,这必须在DLL中本地完成,并从Java JNI调用,就像JIntellitype一样。 这是一个OS级钩子,它没有在JDK中实现,因此必须使用像JIntellitype和jxGrabKey这样的库。 据我所知,还没有人为OSX写过一个。

JIntellitype是Github上的开源软件,所以如果你想知道它是如何工作的,请查看源代码

我刚刚找到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; 

这可以与KeyCode结合使用:

 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); 

代码示例来自这里

更新:我不知道你是否可以从JST的OUTSIDE挂钩事件。 我认为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/

似乎对我来说有点保持不变。 我不确定。
如果有人知道更多,请报告!
我对这个function也很感兴趣。