Я пытаюсь поймать какое-либо событие клавиатуры глобально, не используя ни одного окна, как 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
. Даже когда я делаю акцент на другом приложении или рабочем столе, результат все тот же.
Как я ошибался?
Предполагаете, вы имеете в виду, что пытаетесь прослушивать глобальные нажатия клавиш ОС? Это невозможно сделать из Java, не прибегая к решениям JNI/JNA ... – MadProgrammer
@MadProgrammer, не делает AWT это для меня? –
Нет, AWT фильтрует события так, чтобы они обрабатывали события, которые должны обрабатываться каким-либо компонентом – MadProgrammer