【发布时间】:2013-12-06 20:27:34
【问题描述】:
我试图在不使用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 时,它只会打印“正在收听热键...”。即使我将焦点放在其他应用程序或桌面上,结果仍然相同。
我怎么做错了?
【问题讨论】:
-
我假设您的意思是您正在尝试收听操作系统的全局击键?如果不求助于 JNI/JNA 解决方案,这是无法在 Java 中完成的......
-
@MadProgrammer,AWT 不帮我做吗?
-
不,AWT 过滤事件,只处理需要某些组件处理的事件
-
@MadProgrammer,你是什么意思?例如,我可以通过 AWT 获取和设置剪贴板。
-
那是一个不同的系统。 AWT 根据其管理的组件的可见性过滤键盘和鼠标事件。