有没有办法从外部 Java 桌面应用程序中检索事件信息和 UI 元素数据?具体来说,我需要记录特定文本框的值何时发生变化并从其他几个输入元素中检索数据。
这是针对客户的概念验证项目(不是恶意软件;-))。
Java 应用程序已存在,无法添加或重新编译。可以使用 .NET 或 Java 构建“监听”应用程序。我发现了一些关于 Windows 事件挂钩和 Java Accessibility API 的有限信息,但遇到了障碍,主要是因为我缺乏知识。
我不知道这是否容易做到 - 想法表示赞赏。
有没有办法从外部 Java 桌面应用程序中检索事件信息和 UI 元素数据?具体来说,我需要记录特定文本框的值何时发生变化并从其他几个输入元素中检索数据。
这是针对客户的概念验证项目(不是恶意软件;-))。
Java 应用程序已存在,无法添加或重新编译。可以使用 .NET 或 Java 构建“监听”应用程序。我发现了一些关于 Windows 事件挂钩和 Java Accessibility API 的有限信息,但遇到了障碍,主要是因为我缺乏知识。
我不知道这是否容易做到 - 想法表示赞赏。
请参阅此链接:
外部键侦听器
您可以收听 preionamentos 键,在同一个 API 中,您可以在 monento 中捕获活动窗口标题,以确保应用程序是预期的,从而触发内部事件。
我想到的一种解决方案是编写一个包装现有程序的 Java 程序。
假设原始程序分布在单个 .jar 中。然后,您将编写一个 Java 类,使用此 jar 作为依赖项进行编译,使用此 jar 在类路径中运行,并包含一个main
调用main
该 jar 函数的函数。
public class WrapMyApp {
public static void main(String[] args) {
com.myorg.MyApp.main(args);
}
}
因此,使用这种技术,您可以控制 JVM,并且可以在调用main
.
您可以使用什么技巧从 GUI 中检索一些信息?好吧,如果你幸运的话,也许你可以尝试通过反射 API 访问 GUI 组件。另一种解决方案是遍历 GUI,从JFrame
. 这意味着 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);
SwingUtilities.invokeLater()
尝试访问 GUI 组件时,不要忘记将代码包装在, 中。