簡體   English   中英

如何檢測外部Java應用程序中按下按鈕的時間?

[英]How to detect when a button has been pressed in an external Java application?

我需要在沒有Automation API情況下將自定義拼寫檢查器集成到現有的Java應用程序中。

它應該像這樣工作:

  1. 在外部應用程序A ,用戶打開一個窗口,在那里他/她輸入一些文本。 在那個窗口中有一個按鈕“Spellchecker”。
  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 ,目前行C:\\Program Files\\Java\\jdk1.7.0_25\\jre\\lib\\accessibility.properties assistive_technologies=com.sun.java.accessibility.AccessBridge是評論說。 這可能導致上述可訪問性對象的問題。

我怎樣才能做到這一點? 我認為對於每個Java程序都會啟動一個單獨的JVM。

實際上java app A可以從app B運行。你只需要調用A的main()方法。 所以實際上你啟動B.main()運行必要的B代碼,然后調用A.main()來運行A.在這種情況下,你可以使用Window類方法啟動窗口(或框架)。

public static Window[] getWindows()

在此之后,只需查找找到的窗口的所有子組件,檢查它們的類,當您找到JButton檢查buton的文本或圖像以查找必要的實例。 然后在那里添加你的聽眾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM