【问题标题】:Can't catch a global hotkey (not a window-based app)无法捕捉全局热键(不是基于窗口的应用程序)
【发布时间】: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 根据其管理的组件的可见性过滤键盘和鼠标事件。

标签: java linux awt hotkeys


【解决方案1】:

主类扩展线程 { 公共无效运行(){

    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 循环..

【讨论】:

猜你喜欢
  • 2013-06-12
  • 2011-07-12
  • 2020-10-07
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 2023-03-31
相关资源
最近更新 更多