【问题标题】:Key events on application level in JavaJava 应用程序级别的关键事件
【发布时间】:2023-04-03 11:40:01
【问题描述】:

是否可以在应用程序级别而不是在组件级别获得关键事件的通知?我所说的应用程序级别的意思不是让一个摆动组件接收关键事件,而是让一个特殊的类监听系统范围的关键事件。

这可以在没有 GUI 的应用中使用,或者在需要对关键事件进行更全局处理时使用。

【问题讨论】:

  • 您需要更具体地了解您想要监听的事件。我能想到的唯一通用的就是关机。

标签: java events event-handling keyevent


【解决方案1】:

您可以使用 java.awt.Toolkit 中的 addAWTEventListener() 方法向您的应用程序添加全局事件侦听器。

http://java.sun.com/javase/6/docs/api/java/awt/Toolkit.html#addAWTEventListener%28java.awt.event.AWTEventListener,%20long%29

当然,这仅在您的应用程序具有焦点时才有效。

所以对于关键事件,您可以使用:

public class MyGlobalKeyListener implements AWTEventListener {
    public void eventDispatched(AWTEvent event) {
        // do something here
    }
}

// Then on startup register.
AWTEventListener myGlobalKeyListener = new MyGlobalKeyListener();

Toolkey.getDefaultToolkit().addAWTEventListener(myGlobalKeyListener, AWTEvent.KEY_EVENT_MASK);

【讨论】:

  • hm...如果我一开始就没有 gui 来获得焦点会发生什么?
  • 如果没有 gui 那么你不能从 AWT 获得 KeyEvents。没有 GUI 的键盘的唯一用户输入直接来自 System.in 流,该流接收在控制台中键入的字符。如果即使您的应用程序没有焦点也需要捕获事件,那么我认为您将需要使用 JNI 来访问 PhiLho 建议的操作系统级挂钩。
【解决方案2】:

不确定在本机 Java 中是否可行:在 Windows 中,您必须创建一个 DLL 来挂钩系统(全局)级别的关键事件,我想这是 Unix 或 MacOS 中的不同机制,所以您必须与低级系统 API 的接口以完成此操作。

【讨论】:

  • 这个过程难吗?恐怕我没有win32编程经验。
【解决方案3】:

信号不是一个通用的概念,但某些信号(如用于关机的 ctrl+c)如果不是随处使用,则很普遍。可以使用关闭挂钩来收听该特定信号。调用 Runtime.addShutdownHook(Thread) 将让您知道 VM 何时因任何原因而关闭,并对该事件执行某些操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多