Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java系统范围的键盘快捷键_Java_Keyboard_System_Shortcut - Fatal编程技术网

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