2013-11-22 4 views
1

Я пытаюсь поймать какое-либо событие клавиатуры глобально, не используя ни одного окна, как JFrame, оно должно быть либо консольным приложением, либо службой (демоном). Вот код у меня есть:Не удается поймать глобальную горячую клавишу (не приложение на основе окон)

class Main extends Thread { 
    public void run() { 
     AWTEventListener listener = new AWTEventListener() { 
      @Override 
      public void eventDispatched(AWTEvent event) { 
       try { 
        if (event instanceof KeyEvent) { 
         KeyEvent evt = (KeyEvent) event; 
         if (evt.getID() == KeyEvent.KEY_PRESSED && 
           evt.getModifiers() == KeyEvent.CTRL_MASK && 
           evt.getKeyCode() == KeyEvent.VK_F) { 
          System.out.println("Ctrl+F is pressed!"); 
         } 
        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 

     Toolkit.getDefaultToolkit().addAWTEventListener(listener, AWTEvent.KEY_EVENT_MASK); 
     System.out.println("Listening to hotkeys..."); 
     while (true) { 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
      } 
     } 
    } 

    public static void main(String[] args) { 
     Main b = new Main(); 
     b.start(); 
    } 
} 

Однако, когда я начинаю его, он не делает ничего, кроме печати «Прослушивание горячих клавиш ...», когда я нажимаю Ctrl+F. Даже когда я делаю акцент на другом приложении или рабочем столе, результат все тот же.

Как я ошибался?

+0

Предполагаете, вы имеете в виду, что пытаетесь прослушивать глобальные нажатия клавиш ОС? Это невозможно сделать из Java, не прибегая к решениям JNI/JNA ... – MadProgrammer

+0

@MadProgrammer, не делает AWT это для меня? –

+0

Нет, AWT фильтрует события так, чтобы они обрабатывали события, которые должны обрабатываться каким-либо компонентом – MadProgrammer

ответ

-1

класс Main расширяет тему { общественного недействительными запуска() {

AWTEventListener listener = new AWTEventListener() { 
     @Override 
     public void eventDispatched(AWTEvent event) { 
      try { 
       if (event instanceof KeyEvent) { 
        KeyEvent evt = (KeyEvent) event; 
        if (evt.getID() == KeyEvent.KEY_PRESSED && 
          evt.getModifiers() == KeyEvent.CTRL_MASK && 
          evt.getKeyCode() == KeyEvent.VK_F) { 
         System.out.println("Ctrl+F is pressed!"); 
        } 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
      Toolkit.getDefaultToolkit().addAWTEventListener(listener, AWTEvent.KEY_EVENT_MASK|AWTEvent.ACTION_EVENT_MASK); 


} 


public static void main(String[] args) { 
new JFrame("").setVisible(true); 
    Main b = new Main(); 
    b.start(); 
} 

}

Это работает. Вы не можете использовать цикл while, как вы использовали в своей программе.

+0

Где вы видели JFrame в моем коде? –

+0

Хорошо, извините за это. затем необходимо использовать библиотеку JNI/JNA, вы можете проверить реализацию этой библиотеки по адресу http://grepcode.com/project/repo1.maven.org/maven2/com.github.tulskiy/jkeymaster/ –

+0

, но она также использует окно. –