我试图在不使用像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 :(得分:-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循环。