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