有没有办法从外部 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/