gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:52 24 4
gpt4 key购买 nike

我需要在没有 Automation API 的情况下将自定义拼写检查程序集成到现有的 Java 应用程序中。

它应该像这样工作:

  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 被注释掉了。这可能会导致可访问性对象出现上述问题。

最佳答案

How can I achieve this? I thought that for every Java program a separate JVM is launched.

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

public static Window[] getWindows()

之后,只需查看找到的 Window 的所有子组件,检查它们的类,当您找到 JButton 时,检查按钮的文本或图像以找到必要的实例。然后只需在此处添加您的监听器即可。

关于java - 如何检测外部 Java 应用程序中的按钮何时被按下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17207942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com