我试图在全球范围内捕捉一些键盘事件,而不使用像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
。即使我将重点放在其他应用程序或桌面上,结果仍然是一样的。
我怎么做错了?
我假设你的意思是你试图听OS的全局键击?如果不采用JNI/JNA解决方案,则无法从Java内部完成...... – MadProgrammer
@MadProgrammer,AWT不是为我做的吗? –
不,AWT过滤事件,以便它仅处理需要由某个组件处理的事件 – MadProgrammer