Отслеживание событий во внешнем графическом интерфейсе Java
Есть ли способ получения информации о событиях и элементах пользовательского интерфейса из внешнего настольного Java-приложения? В частности, мне нужно регистрироваться, когда значение определенного текстового поля изменяется, и извлекать данные из нескольких других элементов ввода.
Это для проекта проверки концепции для клиента (не вредоносного ПО;-)).
Приложение Java уже существует и не может быть добавлено или перекомпилировано. Приложение для прослушивания может быть построено с использованием.NET или Java. Я нашел некоторую ограниченную информацию о перехватах событий Windows и API доступности Java, но попал в блок, в основном из-за недостатка знаний.
Я понятия не имею, легко ли это сделать - мысли оценены.
2 ответа
Одно из решений, которое приходит мне в голову, - это написать программу на Java, которая обернет существующую.
Допустим, оригинальная программа распространяется в одном.jar. Затем вы должны написать класс Java, скомпилированный с этим jar-файлом в качестве зависимости, запустить с этим jar-файлом в classpath и содержащий main
функция, которая вызывает main
функция банки.
public class WrapMyApp {
public static void main(String[] args) {
com.myorg.MyApp.main(args);
}
}
Таким образом, используя эту технику, вы контролируете JVM и можете вводить код до или после вызова main
,
Какой прием вы можете использовать для получения информации из графического интерфейса? Что ж, если вам повезет, возможно, вы могли бы попытаться получить доступ к компоненту GUI через API рефлексии. Другое решение состоит в том, чтобы пройти через GUI, начиная с JFrame
, Это подразумевает, что макет графического интерфейса известен заранее, и что он достаточно статичен. Пример:
JWindow w = (JWindow) Window.getWindows()[0];
JPanel p = (JPanel) w.getContentPane().getComponent(2);
JTextArea t = (JTextArea) p.getComponent(5);
String s = t.getText();
Вы можете использовать такие инструменты, как SwingExplorer, чтобы изучить макет графического интерфейса, чтобы узнать, где находятся ваши компоненты.
Если это не работает, вы можете попытаться подключиться к EventQueue, прослушивая ключевые события:
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
public void eventDispatched(AWTEvent event) {
// useful code here
}
}, AWTEvent.KEY_EVENT_MASK);
Не забудьте обернуть ваш код внутри SwingUtilities.invokeLater()
, при попытке доступа к компонентам графического интерфейса.
Смотрите эту ссылку:
Внешний ключ слушателя
Вы можете прослушать ключ precionamentos, в этом же API вы можете захватить заголовок активного окна в monento, чтобы убедиться, что приложение ожидается, и, таким образом, вызвать внутренние события.