是否可以从 Java 程序中捕获 Windows 弹出消息框?

Posted

技术标签:

【中文标题】是否可以从 Java 程序中捕获 Windows 弹出消息框?【英文标题】:Is it possible to capture a Windows pop-up message box from inside a Java program? 【发布时间】:2010-09-02 18:59:01 【问题描述】:

我有一个在 Windows 服务器上运行的 Java 进程,我必须在其中启动一个命令行 exe。我正在使用

Process p = Runtime.getRuntime().exec(command);
OutputStream stdin = p.getOutputStream();
InputStreamstderr = p.getErrorStream();
InputStream stdout = p.getInputStream();

运行流程并捕获标准输入/输出流。我遇到的问题是我必须运行的一个 exe 程序会抛出一个弹出消息框,需要单击“确定”才能完成失败。 我的 Java 程序在后台运行,因此它没有弹出消息框的窗口,这意味着当 exe 错误时,Java 程序将挂起,直到有人注意到它并在任务管理器中将其杀死。

有没有办法从 Java 中捕获或检测这些弹出框?

【问题讨论】:

【参考方案1】:

你可能很幸运。 您可以使用JNA 调用Win32 API 的EnumerateWindows 或FindWindow。 然后通过FindWindowEx 搜索按钮。

然后通过调用PostMessage 并发送BM_CLICK“点击”它

您可能希望有一个单独的观察者线程来执行所有这些操作,因为您的程序等待进程结束或继续。

对不起,我的回答很粗糙。晚餐优先。

【讨论】:

这是一种肯定的方法,在开始这条道路之前,我会仔细考虑。出于所有实际目的,该应用程序不再是 Java 应用程序。 确实如此。但与此同时,应用程序的描述听起来好像永远不会在 Windows 环境之外使用。此外,当特定于平台的代码整齐地封装在一个单独的类中时,我会认为这是一个相当困难但也很干净的解决方案。如果 Sunoracle 尚未构建到底层操作系统的桥梁,您必须自己动手。 这是一个有趣的想法。我拥有的应用程序实际上是一个更大的系统的一部分,需要在任何类型的操作系统上运行。这个弹出问题只发生在我必须运行的 Windows 服务器上,所以这样的想法仍然有效,我可以将它作为 exec() 调用下的层添加。 所以这将是System.getProperty("os.name").toLowerCase().indexOf( "win" ) >= 0 的问题,或者您也可以编写一个非常小的 C++ 进程与您的工具一起运行,充当看门狗并关闭该弹出窗口。但这不是一个非常干净的解决方案。【参考方案2】:

没有。这只是一个正在运行的进程。

生成任何提供 GUI 或任何其他无法通过标准输入/输出控制的控制方法的东西毫无意义。

【讨论】:

【参考方案3】:

不,据我所知不是直接的。但是,您可能可以执行某种形式的异步通知。例如,您可以将特定应用程序发布到您的应用程序可以订阅的 JSM 队列中的主题。如果您没有选择 JMS 路由的选项,则可以使用基于文件通知的触发器。您可以让其他应用在公共目录中创建一个虚拟文件,然后让您的应用监控该目录。

底线是我认为您不能从您的进程中的另一个进程捕获弹出窗口。所以你需要做某种形式的外部/异步处理来捕获它。

【讨论】:

如果您能解释投票否决的原因,我将不胜感激?在没有好的解释的情况下投反对票并不是很好!【参考方案4】:

一个不优雅但简单的解决方案是超时。

【讨论】:

以上是关于是否可以从 Java 程序中捕获 Windows 弹出消息框?的主要内容,如果未能解决你的问题,请参考以下文章

Windows 7 任务栏:捕获缩略图

Windows程序闪退Windows日志捕获Kernelbase模块错误

是否有一种标准方法来捕获适用于 linux 和 windows 的 c++ 应用程序中的键盘输入?

是否可以使用 ffmpeg 从 ASIO 设备捕获音频?

是否可以通过 Windows 键捕获 Windows 开始菜单弹出窗口(可能没有钩子)?

如何使用小程序从 Java 中的网络摄像头捕获视频?