我有一个Swing应用程序,它由一个设置为Always On Top的JFrame组成。
在Windows下运行时,我使用以下代码分别打开本机默认电子邮件客户端和浏览器:
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,前者阻碍了后者。
我们当前的“解决方案”是在打开本机窗口的同时最小化JFrame。但事实证明这是一个508合规问题,我们被要求:
我想到的策略是“关闭”JFrame的Always On Top状态并拥有某种回调或事件监听器,它将通知JFrame电子邮件或浏览器窗口已关闭,然后切换JFrame返回Always On Top状态并设置焦点。
因为这是一个Java应用程序,我担心这几乎是不可能的,因为我们正在谈论本机互操作。我的策略是否可行,是否有更好的可行策略,最重要的是,如何才能实现?!
提前致谢!
答案 0 :(得分:1)
我不确定是否有本机方法可以执行此操作,但您可以运行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,因为我认为您不能在此OR上过滤任务列表。
我确信这可以推广到寻找原始电话打开的内容。
编辑:现在我已经写完了所有这些,我发现原来的调用返回了一个可以使用的进程。所以要尝试一下,启动一个新线程,打开该线程中的默认电子邮件程序或浏览器,删除“always on top”条件并在返回的进程上调用waitfor。通话结束后,设置“始终在线”状态。该线程将等待进程结束而不会锁定你的gui或其他程序函数。
答案 1 :(得分:0)
我在以下方面取得了一些成功:
这种方法有两个缺点。第一个是用户可能会在关闭浏览器窗口之前手动返回JFrame窗口,导致JFrame重新获得焦点并陷入Always On Top模式。但这可能是可以接受的。第二个问题是,一旦JFrame重新获得焦点,JAWS版本9屏幕阅读器就会疯狂并重新读取最后一个焦点组件至少3次。