java - 跟踪外部 Java GUI 中的事件

标签 java events accessibility-api

有没有办法从外部 Java 桌面应用程序检索事件信息和 UI 元素数据?具体来说,我需要记录特定文本框的值何时发生变化,并从其他几个输入元素中检索数据。

这是针对客户的概念验证项目(不是恶意软件;-))。

Java 应用程序已存在,无法添加或重新编译。 “监听”应用程序可以使用.NET 或Java 构建。我发现了一些有关 Windows 事件 Hook 和 Java Accessibility API 的有限信息,但遇到了障碍,主要是由于我缺乏知识。

我不知道这是否容易完成 - 想法值得赞赏。

最佳答案

我想到的一个解决方案是编写一个包装现有程序的 Java 程序。

假设原始程序分布在单个 .jar 中。然后,您将编写一个 Java 类,使用此 jar 作为依赖项进行编译,在类路径中使用此 jar 运行,并包含一个 main 函数,该函数调用 jar 。

public class WrapMyApp {
    public static void main(String[] args) {
        com.myorg.MyApp.main(args);
    }
}

因此,使用此技术,您可以控制 JVM,并且可以在调用 main 之前或之后注入(inject)代码。

您可以使用什么技巧从 GUI 检索一些信息?好吧,如果你幸运的话,也许你可以尝试通过反射 API 访问 GUI 组件。另一种解决方案是从 JFrame 开始遍历 GUI。这意味着 GUI 布局是预先已知的,并且它足够静态。示例:

    JWindow w = (JWindow) Window.getWindows()[0];
    JPanel p = (JPanel) w.getContentPane().getComponent(2);
    JTextArea t = (JTextArea) p.getComponent(5);
    String s = t.getText();

您可以使用类似 SwingExplorer 的工具探索 GUI 布局,以便发现组件所在的位置。

如果这不起作用,您可以尝试挂接到EventQueue,监听关键事件:

    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

        public void eventDispatched(AWTEvent event) {
            // useful code here
        }
    }, AWTEvent.KEY_EVENT_MASK);

当尝试访问 GUI 组件时,不要忘记将代码包装在 SwingUtilities.invokeLater() 中。

关于java - 跟踪外部 Java GUI 中的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14602692/

相关文章:

java - 关于如何提高 Java String 到 byte[] 转换性能的任何建议?

java - 线性冲突违反了可接受性并使我发疯

java - SQL查询中无法获取整数值的参数

java - 如何通过属性查找ArrayList中的对象

c++ - 通过 eventFilter 获取 QLineEdit 的某些属性到剪贴板

android - 生物识别提示和辅助服务

javascript - 使用javascript检测ipad或iphone屏幕上的双击

events - 在 MIDI channel 事件中解码 RPN

objective-c - 在应用程序准备使用(启动)之前调用 NSWorkspaceDidActivateApplicationNotification