有没有什么办法让一个全系统的(全球)的键盘快捷方式 执行Java应用程序的动作?

任何AWT / Swing的绑定?

有帮助吗?

解决方案

有没有,但在Windows中可以使用这样的:

jintellitype

不幸的是,没有任何我所知道的用于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/

似乎是一点点没有维护我。我不知道。结果 如果有人知道更多,请报告!点击 我也是在这个功能很感兴趣。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top