6

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

4

1 回答 1

4

我怎样才能做到这一点?我认为对于每个 Java 程序都会启动一个单独的 JVM。

实际上,Java 应用 A 可以从应用 B 运行。您只需调用 A 的 main() 方法。所以实际上你启动 B.main() 来运行必要的 B 代码,然后调用 A.main() 来运行 A。在这种情况下,你可以使用 Window 类方法启动窗口(或框架)。

public static Window[] getWindows()

之后,只需查看找到的 Window 的所有子组件,检查它们的类,并在找到时JButton检查按钮的文本或图像以找到必要的实例。然后在那里添加你的听众。

于 2013-06-20T09:29:07.440 回答