Java系统范围的键盘快捷键
是否有任何方法或库可以获得系统范围(全局)的键盘快捷键Java系统范围的键盘快捷键,java,keyboard,system,shortcut,Java,Keyboard,System,Shortcut,是否有任何方法或库可以获得系统范围(全局)的键盘快捷键 在Java应用程序中执行操作 更新:我不知道是否可以从JVM外部钩住事件。我认为Swing/AWT组件必须有焦点才能工作 您需要挂接JavaAWT事件队列,以确保能够获得全局(jvm范围)按键 使用 我认为可能还有其他方法可以通过动作图完成全球按键。实际上,我已经使用了上述方法,但在windows中,您可以使用以下方法: 不幸的是,对于Linux和OSX,我所知不多,这可能就是为什么它没有随java开箱即用的原因 如果您找到其他平台,请在
在Java应用程序中执行操作 更新:我不知道是否可以从JVM外部钩住事件。我认为Swing/AWT组件必须有焦点才能工作 您需要挂接JavaAWT事件队列,以确保能够获得全局(jvm范围)按键 使用
我认为可能还有其他方法可以通过动作图完成全球按键。实际上,我已经使用了上述方法,但在windows中,您可以使用以下方法: 不幸的是,对于Linux和OSX,我所知不多,这可能就是为什么它没有随java开箱即用的原因 如果您找到其他平台,请在此处发布:)
为了couriosity,你在用它做什么?对于windows,你需要一个键盘挂钩dll。 您可以从java初始化dll,这将导致它注册侦听器。 你会得到你需要的。检查msdn中的dll挂钩或键盘挂钩。其中一个应该能帮你 对于linux,我认为这应该更容易,但我自己从来没有这样做过 Google的第一个结果是“linux侦听全局按键”(无引号),我认为这会对X11环境有所帮助 OSX可能只是能够使用一个与此类似的解决方案。 但最终,您可能需要为每个平台提供一个dll,除非JNA可以毫无问题地完成这项工作,否则最糟糕的情况已经发生。JDIC(Java桌面集成)可能会有所帮助
对我来说,这似乎有点缺乏维护。我不确定。
如果有人知道更多,请报告
我对这个特性也很感兴趣。我是JIntellitype的作者,我可以告诉你一个事实,这必须在DLL中本机完成,并从Java JNI调用,就像JIntellitype那样。这是一个操作系统级的钩子,没有在JDK中实现,因此必须使用JIntellitype和jxGrabKey等库。据我所知,还没有人为OSX写过 JIntellitype在Github上是开源的,所以如果你想了解它的工作原理,只需查看我刚找到的代码 似乎是跨平台的 下面是他们监听按键的示例代码:
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):
您可以将其与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);
代码示例来自您现在可以使用JNA-请参阅 我已经在Windows 10笔记本电脑上很容易地实现了这一点——我个人没有在其他平台上进行过测试——显然,它也适用于MacOS和“基于X11的系统(理论上,仅在一些Linux发行版和PCBSD上测试)” 这应该不难设置-您将需要slf4j使其运行 您不需要构建jar 例如,此代码有效地禁用了“f”键,并记录您按下该键的事实
import com.tulskiy.keymaster.common.Provider;
import com.tulskiy.keymaster.common.HotKeyListener;
import com.tulskiy.keymaster.common.HotKey;
import javax.swing.*;
// ...
Provider provider = Provider.getCurrentProvider(false);
provider.register(KeyStroke.getKeyStroke("F"), new HotKeyListener() {
public void onHotKey(HotKey hotKey) {
System.out.println(hotKey);
}
});
我希望这对某人有所帮助@basszero:关于你的更新,是的,java应用程序必须有焦点才能工作。谢谢你的回复。我想要这个功能,所以我希望用户可以从系统的任何地方带来一个弹出窗口。这在windows应用程序中非常常见,但我需要跨平台支持。是的,好吧,我想我们必须等待。我听说在Linux和OSX中很容易做到这一点,我不知道为什么已经编写了一个中间平台第三方。当然Sun不支持它。Jintellitype提到了JxGrabKey()项目,该项目为Linux提供了相同的功能。使用JNA有任何内置功能可用吗?
// 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);
import com.tulskiy.keymaster.common.Provider;
import com.tulskiy.keymaster.common.HotKeyListener;
import com.tulskiy.keymaster.common.HotKey;
import javax.swing.*;
// ...
Provider provider = Provider.getCurrentProvider(false);
provider.register(KeyStroke.getKeyStroke("F"), new HotKeyListener() {
public void onHotKey(HotKey hotKey) {
System.out.println(hotKey);
}
});