2013-08-23 5 views
0

Код ниже - тестируемый класс, который должен печатать какой-либо текст, когда элемент управления + A был нажат на клавиатуре, а также отображает изображение на панели задач. Все это зависит от системного лотка, поддерживаемого вашей операционной системой.MenuShortcut KeyEvent не работает

Моя проблема заключается в том, что текст не распечатывается, когда я нажимаю кнопку управления + 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(); 
     } 
    }  
} 

} 
+0

'' Что я делаю неправильно? "' - для одного, а не для публикации [sscce] (http://sscce.org). Пожалуйста, отправьте код, который мы можем проверить, изменить и запустить. –

+0

Он был обновлен с помощью SSCCE. – Tyluur

+1

Черт, почему ты задаешь один и тот же вопрос дважды? Мы сказали вам в вашем предыдущем вопросе, что Java не будет работать таким образом, что KeyListeners не работают для приложений, которые не имеют фокуса, и ответ, как ни удивительно, все тот же! –

ответ

2

Причина, по которой ваш код не работает, заключается в том, что Java не «глобально» прослушивает ваше ключевое событие, но только в том случае, когда в меню отображается ваш фокус и отображается.

Это также является причиной того, что нет возможности писать чистый кейлоггер Java. Java позволяет вам захватывать сообщения, ориентированные на окна.

Обходной бы реализовать один из следующих вариантов:

  • Использование JNI/ЮНА/любой родной оболочкой для доступа к глобальной ключ перекинув
  • Используйте невидимое окно, чтобы всегда быть на высоте и не показано системный лоток, который захватывает события. Я бы не предложил использовать этот, поскольку он может либо не работать, как очарование, либо раздражает вашего пользователя.

Верхний подход не является сложным, но потребует от вас использования собственного доступа, и поэтому ваше приложение становится специфичным для платформы.

Удачи вам!

0

С API, это выглядит, как вы должны попробовать этот конструктор для MenuItem()

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

, как по умолчанию требует, чтобы клавиша переключения будет нажата слишком.

+0

Я изменил VK_A на VK_F12, так как VK_A является широко используемой горячей клавишей для многих программ и добавляет ложный аргумент, но нет никакой разницы. – Tyluur

+0

Запустив свой код сейчас, я согласен с @BartPelle. Но это должно было быть исправлено и сменой клавиш. – n0741337

Смежные вопросы