Как определить, когда кнопка была нажата во внешнем приложении Java?

мне нужно интегрировать пользовательскую проверку орфографии в существующий Java без Automation API.

он должен работать так:

  1. во внешнем приложении A пользователь открывает окно, где он вводит какой-то текст. В этом окне есть кнопка "проверка орфографии".
  2. когда пользователь нажимает кнопку" Проверка орфографии", моя программа B должна прочитать текст из текстового поля A и поместить его в пользовательское проверка орфографии.

как я могу обнаружить, что какая кнопка была нажата во внешнем Java приложения?

обновление 1: я попытался установить свой собственный прослушиватель событий AWT для обнаружения событий в других приложениях.

    Toolkit.getDefaultToolkit().addAWTEventListener(new MyAWTEventListener(), AWTEvent.MOUSE_MOTION_EVENT_MASK);

    while (true)
    {
        Thread.sleep(1);
    }

но это не работает.

обновление 2: замена очереди системных событий также не работает.

private void queuePushingExperiment() throws InterruptedException,
        InvocationTargetException {
    EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue();

    queue.push(new MyEventQueue());

    EventQueue.invokeAndWait(new Runnable() {

        @Override
        public void run() {
            System.out.println("run");
        }
    });
}

public class MyEventQueue extends EventQueue {

    @Override
    public SecondaryLoop createSecondaryLoop() {
        System.out.println("createSecondaryLoop");
        return super.createSecondaryLoop();
    }

    @Override
    protected void dispatchEvent(AWTEvent event) {
        System.out.println("dispatchEvent");
        super.dispatchEvent(event);
    }

    @Override
    public AWTEvent getNextEvent() throws InterruptedException {
        System.out.println("getNextEvent");
        return super.getNextEvent();
    }

    @Override
    public AWTEvent peekEvent() {
        System.out.println("peekEvent");
        return super.peekEvent();
    }

    @Override
    public AWTEvent peekEvent(int id) {
        System.out.println("peekEvent");
        return super.peekEvent(id);
    }

    @Override
    protected void pop() throws EmptyStackException {
        System.out.println("pop");
        super.pop();
    }

    @Override
    public void postEvent(AWTEvent theEvent) {
        System.out.println("postEvent");
        super.postEvent(theEvent);
    }

    @Override
    public void push(EventQueue newEventQueue) {
        System.out.println("push");
        super.push(newEventQueue);
    }

}

обновление 3: java.awt.Window.getOwnerlessWindows() и EventQueueMonitor.getTopLevelWindows() как возвращайте пустые массивы, даже если есть JFrame открыть во время их призыв.

обновление 4: я заметил, что не могу писать в файл C:Program FilesJavajdk1.7.0_25jrelibaccessibility.properties и в настоящее время строку assistive_technologies=com.sun.java.accessibility.AccessBridge закомментирован. Что может вызвать вышеупомянутые проблемы с объектами доступности.

1 ответов


как я могу добиться этого? Я думал, что для каждой Java-программы запускается отдельная JVM.

на самом деле java-приложение A может быть запущено из приложения B. Вы просто вызываете метод main() A. Таким образом, вы запускаете B. main (), который запускает необходимый код B, а затем вызывает A. main() для запуска A. В этом случае вы можете запустить окно (или фрейм) с помощью метода класса Window.

public static Window[] getWindows()

после этого просто спуститесь все подкомпоненты найденного окна, проверяя их классы и когда вы найдете JButton проверьте текст или изображение бутона, чтобы найти необходимый экземпляр. Затем просто добавьте туда своего слушателя.