无法捕获全局热键(不是基于窗口的应用程序)

时间:2013-11-22 03:53:28

标签: java linux awt hotkeys

我试图在不使用像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时,它只会打印“聆听热键...”。即使我专注于其他应用程序或桌面,结果仍然是相同的。

我是怎么做错的?

1 个答案:

答案 0 :(得分:-1)

类Main扩展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|AWTEvent.ACTION_EVENT_MASK);


}


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

}

这很有效。您不能像在程序中使用的那样使用while循环。