Как определить, когда кнопка была нажата во внешнем приложении Java?
мне нужно интегрировать пользовательскую проверку орфографии в существующий Java
без Automation API
.
он должен работать так:
- во внешнем приложении
A
пользователь открывает окно, где он вводит какой-то текст. В этом окне есть кнопка "проверка орфографии". - когда пользователь нажимает кнопку" Проверка орфографии", моя программа 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
проверьте текст или изображение бутона, чтобы найти необходимый экземпляр. Затем просто добавьте туда своего слушателя.