【问题标题】:MenuShortcut KeyEvent not workingMenuShortcut KeyEvent 不起作用
【发布时间】:2013-08-23 22:07:46
【问题描述】:

下面的代码是一个可测试的类,当在键盘上按下 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();
        }
    }       
}

}

【问题讨论】:

  • "What am I doing wrong?" -- 首先,不发布sscce。请发布我们可以测试、修改和运行的代码。
  • 已更新为 SSCCE。
  • 见鬼,你为什么要两次问同一个问题?我们在您之前的问题中告诉过您,Java 不会以这种方式工作,KeyListeners 不适用于没有焦点的应用程序,而且答案仍然是一样的!

标签: java keyevent system-tray trayicon tray


【解决方案1】:

您的代码不工作的原因是因为 Java 没有“全局”侦听您的关键事件,但仅当菜单具有您的焦点并显示时。

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

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

  • 使用 JNI/JNA/任何本机包装器来访问全局密钥挂钩
  • 使用不可见的窗口,始终位于顶部且不显示在捕获事件的系统托盘中。我不建议使用这个,因为它可能不会像魅力一样发挥作用或惹恼您的用户。

顶级方法并不难,但需要您使用本机访问,因此您的应用程序变得特定于平台。

祝你好运!

【讨论】:

    【解决方案2】:

    从 API 看来,您应该为 MenuItem() 尝试此构造函数

    MenuShortcut shortcut = new MenuShortcut(KeyEvent.VK_A, false);
    

    默认情况下也要求按下 Shift 键。

    【讨论】:

    • 我把 VK_A 改成了 VK_F12,因为 VK_A 是很多程序常用的热键,并添加了 false 参数,但没有区别。
    • 现在运行您的代码,我同意@BartPelle。但这也应该解决需要 shift 键的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多