MenuShortcut KeyEvent不起作用

时间:2013-08-23 22:07:47

标签: java keyevent system-tray trayicon tray

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

我的问题是,当我按下控制键+ 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();
        }
    }       
}

}

2 个答案:

答案 0 :(得分:2)

您的代码无法正常工作的原因是因为Java并非“全局”监听您的关键事件,而是仅在菜单具有焦点并显示时才显示。

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

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

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

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

祝你好运!

答案 1 :(得分:0)

从API看起来,您应该尝试使用MenuItem()

的构造函数
MenuShortcut shortcut = new MenuShortcut(KeyEvent.VK_A, false);

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