gpt4 book ai didi

java - Swing JFrame 响应 native 窗口关闭事件

转载 作者:太空宇宙 更新时间:2023-11-04 08:47:11 24 4
gpt4 key购买 nike

我有一个 Swing 应用程序,其中包含一个设置为“Always On Top”的 JFrame。

在Windows下运行时,我使用以下代码分别打开 native 默认电子邮件客户端和浏览器:

Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + Utils.formatMailtoUrl(to, subject, body));
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);

由于 JFrame 设置为 Always On Top,而典型的默认浏览器或电子邮件客户端(我们客户的 IE 和 Outlook)不会以 Always On Top 方式打开,因此前者会阻碍后者。

我们当前的“解决方案”是在打开 native 窗口的同时最小化 JFrame。但这是一个 508 合规问题,我们被要求:

  1. 不最小化 JFrame。
  2. 浏览器或电子邮件客户端关闭后将焦点返回到 JFrame

我想到的策略是“关闭”JFrame 的 Always On Top 状态,并使用某种回调或事件监听器来通知 JFrame 电子邮件或浏览器窗口已关闭,然后将 JFrame 切换回 Always On Top 状态并设置焦点。

因为这是一个 Java 应用程序,我担心这几乎是不可能的,因为我们正在谈论 native 互操作。我的策略可行吗?有更好的可行策略吗?最重要的是,如何才能做到?!

提前致谢!

最佳答案

我不确定是否有本地方法可以执行此操作,但您可以运行 tasklist.exe 或 vb 脚本,捕获结果并从那里确定 Outlook 或 IExplore 是否正在运行。这需要您以合理的时间间隔运行检查,而不是等待事件。

Process p = Runtime.getRuntime().exec("tasklist.exe /FO CSV /FI eq outlook.exe");
BufferedReader input = new BufferedReader (new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
look for a line containing outlook.exe
}
input.close();

您必须分别检查 Outlook.exe 和 iexplorer.exe,因为我认为您无法在这个或那个上过滤任务列表。

我确信这可以推广到查找您原始调用打开的任何内容。

编辑:既然我已经写完了所有这些,我突然想到您最初的调用会返回一个可以使用的进程。因此,可以尝试一下,启动一个新线程,在该线程中打开默认电子邮件程序或浏览器,删除“始终在最前面”条件并在返回的进程上调用 waitfor 。调用后,设置“始终位于最前面”条件。该线程将等待进程结束,而不锁定您的 gui 或其他程序功能。

关于java - Swing JFrame 响应 native 窗口关闭事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4059753/

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