我需要将自定义拼写检查器集成到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 Files\Java\jdk1.7.0_25\jre\lib\accessibility.properties
,目前该行assistive_technologies=com.sun.java.accessibility.AccessBridge
已被注释掉。这可能会导致可访问性对象出现上述问题。