Java
カスタム スペル チェッカーを既存のアプリケーションに統合する必要がありAutomation API
ます。
次のように動作するはずです。
- 外部アプリケーション
A
で、ユーザーはウィンドウを開き、テキストを入力します。そのウィンドウには「スペルチェッカー」ボタンがあります。 - ユーザーが「スペルチェッカー」ボタンを押すと、私のプログラム 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
がコメントアウトされていることに気付きました。これにより、前述のアクセシビリティ オブジェクトの問題が発生する可能性があります。