2013-11-22 26 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

我假設你的意思是你試圖聽OS的全局鍵擊?如果不採用JNI/JNA解決方案,則無法從Java內部完成...... – MadProgrammer

+0

@MadProgrammer,AWT不是爲我做的嗎? –

+0

不,AWT過濾事件,以便它僅處理需要由某個組件處理的事件 – MadProgrammer

回答

-1

類主要繼承Thread { 公共無效的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|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

上檢查此庫的實現,但它也使用一個窗口。 –