我需要将自定义拼写检查器集成到现有的Java应用程序中而不需要Automation API.
它应该像这样工作:
A,用户打开一个窗口,在那里他/她输入一些文本.在那个窗口中有一个按钮"Spellchecker".如何检测外部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被注释掉了.这可能导致上述可访问性对象的问题.
我怎样才能实现这个目标?我认为每个 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检查按钮的文本或图像以找到必要的实例。然后只需在那里添加您的侦听器即可。
| 归档时间: |
|
| 查看次数: |
327 次 |
| 最近记录: |