Java MenuShortcut KeyEvent不工作

Java MenuShortcut KeyEvent不工作,java,keyevent,system-tray,trayicon,tray,Java,Keyevent,System Tray,Trayicon,Tray,下面的代码是一个可测试类,当按下键盘上的control+a时,它应该打印出一些文本,并且还会在系统托盘中显示一个图像。这完全取决于操作系统支持的系统托盘 我的问题是,当我按下control+A时,文本没有打印出来,只有在我按下系统托盘中的项目时才会打印出来 /** * * @author Tyluur * @since Aug 23, 2013 */ public class Testable { public static void main(String... args) {

下面的代码是一个可测试类,当按下键盘上的control+a时,它应该打印出一些文本,并且还会在系统托盘中显示一个图像。这完全取决于操作系统支持的系统托盘

我的问题是,当我按下control+A时,文本没有打印出来,只有在我按下系统托盘中的项目时才会打印出来

/**
 *
 * @author Tyluur
 * @since Aug 23, 2013
 */
public class Testable {

public static void main(String... args) {
    registerTrayItems();
}

private static void registerTrayItems() {
    if (SystemTray.isSupported()) {
        SystemTray tray = SystemTray.getSystemTray();
        TrayIcon icon = null;
        MenuShortcut shortcut = new MenuShortcut(KeyEvent.VK_A);
        MenuItem menuItem = new MenuItem("Toggle", shortcut);
        menuItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.err.println("The action has been called!");
            }
        });
        PopupMenu popup = new PopupMenu();
        popup.add(menuItem);
        try {
            icon = new TrayIcon(new ImageIcon(new URL("http://i.imgur.com/xQoz2TN.png")).getImage(), "Typer", popup);
            tray.add(icon);
        } catch (MalformedURLException | AWTException e) {
            e.printStackTrace();
        }
    }       
}

}

从API上看,似乎应该为MenuItem()尝试此构造函数


默认情况下,也需要按下Shift键。

您的代码不工作的原因是Java没有“全局”监听按键事件,而只是在菜单有焦点且显示时

这也是为什么不可能编写纯Java键盘记录器的原因。Java只允许您捕获窗口定向的消息

解决办法是实施以下选项之一:

  • 使用JNI/JNA/任何本机包装器来访问全局密钥挂钩
  • 使用一个不可见的窗口,始终位于顶部,不显示在捕获事件的系统托盘中。我不建议使用这一个,因为它可能不会像一个迷人的工作或烦扰您的用户
顶级方法并不难,但需要您使用本机访问,因此您的应用程序将变得特定于平台


祝你好运

“我做错了什么?”
——比如,我没有发布一条消息。请发布我们可以测试、修改和运行的代码。它已经用SSCCE进行了更新。见鬼,你为什么要问同样的问题两次?我们在上一个问题中告诉过您,Java不会以这种方式工作,KeyListener不适用于没有焦点的应用程序,而且答案(毫不奇怪)仍然是一样的!我将VK_A更改为VK_F12,因为VK_A是许多程序常用的热键,并添加了错误参数,但没有区别。现在运行代码后,我同意@BartPelle。但这应该已经修复了对shift键的需要。
MenuShortcut shortcut = new MenuShortcut(KeyEvent.VK_A, false);