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

标签 java windows swing accessibility section508

我有一个 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/

相关文章:

java - 计算 y = 1/1 + 2/3 + 3/5 + 4/7 + ....... + n/(2n-1) 的值,其中 n 是用户输入

java - 如何正确格式化java时间

java - spring-hibernate映射问题

php - 将 HTML/PHP 从 Windows 保存到 Linux 的复杂性 - 换行解决方案不起作用

java - 如何将 JScrollPane 的滚动条放置在自定义位置?

java - JCheckBox 数组

java - 为了绘制轻量级组件,需要递归更新或绘制什么?

java - 使用公共(public)方法更改 Java 中的私有(private)字段

windows - 他们是否存在可以存储或保存系统音频的任何软件?

c++ - 对 `TextOutA@20' 的 undefined reference