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

上检查此库的实现,但它也使用一个窗口。 –