Отслеживание событий во внешнем графическом интерфейсе 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, чтобы убедиться, что приложение ожидается, и, таким образом, вызвать внутренние события.

Другие вопросы по тегам