如何检测外部Java应用程序中按下按钮的时间?

DP_*_*DP_ 6 java swing

我需要将自定义拼写检查器集成到现有的Java应用程序中而不需要Automation API.

它应该像这样工作:

  1. 在外部应用程序中A,用户打开一个窗口,在那里他/她输入一些文本.在那个窗口中有一个按钮"Spellchecker".
  2. 当用户按下"拼写检查"按钮时,我的程序B应该从A的文本字段中读取文本并将其放入自定义拼写检查程序中.

如何检测外部Java应用程序中是否按下某个按钮?

更新1:我尝试安装自己的AWT事件监听器来检测其他应用程序中的事件.

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

    while (true)
    {
        Thread.sleep(1);
    }
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

更新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);
    }

}
Run Code Online (Sandbox Code Playgroud)

更新3: java.awt.Window.getOwnerlessWindows()EventQueueMonitor.getTopLevelWindows()都返回即使有一个空数组JFrame在他们invokation的时间开放.

更新4:我注意到我无法写入文件C:\Program Files\Java\jdk1.7.0_25\jre\lib\accessibility.properties,目前该行assistive_technologies=com.sun.java.accessibility.AccessBridge被注释掉了.这可能导致上述可访问性对象的问题.

Sta*_*avL 4

我怎样才能实现这个目标?我认为每个 Java 程序都会启动一个单独的 JVM。

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

public static Window[] getWindows()
Run Code Online (Sandbox Code Playgroud)

之后,只需查看找到的窗口的所有子组件,检查它们的类,当您找到时,JButton检查按钮的文本或图像以找到必要的实例。然后只需在那里添加您的侦听器即可。