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

时间:2009-01-19 19:08:22

标签: java keyboard system shortcut

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

任何AWT / Swing绑定?

7 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:12)

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

jintellitype

不幸的是,对于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);
            }
        });

我希望这对某人有帮助