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

时间:2013-06-20 07:42:09

标签: java swing

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

它应该像这样工作:

  1. 在外部应用程序A中,用户打开一个窗口,在其中输入一些文本。在那个窗口中有一个按钮“Spellchecker”。
  2. 当用户按下“拼写检查”按钮时,我的程序B应该从A的文本字段中读取文本并将其放入自定义拼写检查器中。
  3. 如何在外部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已被注释掉。这可能会导致上述辅助功能对象出现问题。

1 个答案:

答案 0 :(得分:4)

  

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

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

public static Window[] getWindows()

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