有没有办法获得系统范围的(全局)键盘快捷方式 在Java应用程序中执行操作?
任何AWT / Swing绑定?
答案 0 :(得分:13)
我是JIntellitype的作者,我可以告诉你一个事实,这必须在DLL中本地完成,并从Java JNI调用,就像JIntellitype一样。这是一个未在JDK中实现的OS级别挂钩,因此必须使用JIntellitype和jxGrabKey之类的库。据我所知,还没有人为OSX写过一篇。
JIntellitype是Github上的开源软件,所以如果你想知道它是如何工作的,请查看source代码
答案 1 :(得分:12)
没有,但在Windows中你可以使用它:
不幸的是,对于Linux和OSX我没有任何意识,这可能就是为什么它没有开箱即用的。
如果你发现其他平台发布在这里请:)
只是为了咳嗽,你在做什么呢?
答案 2 :(得分:7)
我刚刚找到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){...}
这是here
的修改示例您还应该修改默认的日志记录行为,否则它会向控制台发送垃圾邮件:
// 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);
代码示例来自here
答案 3 :(得分:2)
更新:我不知道你是否可以从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
答案 4 :(得分:2)
对于Windows,你需要一个键盘钩dll。 您可以从java初始化您的dll,这将导致它注册侦听器。 你会得到你需要的东西。检查msdn是否有dll挂钩或键盘挂钩。其中一个应该让你振作起来。
对于Linux我认为这应该更容易,但我自己从未这样做过。
http://ubuntuforums.org/showthread.php?t=864566
Google的第一个结果是“linux监听全局按键”(没有引号),我认为这会帮助你解决X11环境问题
OSX可能只能使用接近此的解决方案。 但最终,你可能需要为每个平台都有一个dll,除非JNA可以毫无问题地做到这一点,然后最糟糕的就完成了。
答案 5 :(得分:1)
JDIC(Java桌面集成)可以帮助你 的 https://jdic.dev.java.net/ 强>
似乎对我有点保持不变。我不确定。
如果有人知道更多,请报告!
我对这个功能也非常感兴趣。
答案 6 :(得分:0)
您现在可以使用JNA-请参见https://github.com/tulskiy/jkeymaster
我已经在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);
}
});
我希望这对某人有帮助