我試圖在全球範圍內捕捉一些鍵盤事件,而不使用像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