QT如何设置程序运行完弹出消息框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT如何设置程序运行完弹出消息框相关的知识,希望对你有一定的参考价值。

参考技术A atexit( void (* function) (void) )

一般程序执行到 main() 的结束就完成了, 如果想在程序结束时做一些事情, 可以尝试着用这个函数: atexit( void (* function) (void) )

#include <stdio.h>
#include <stdlib.h>
void f1(void)
printf("exit f1\n");


void f2(void)
printf("exit f2\n");


int main()
atexit(f1);
atexit(f2);
printf("exit main\n");
return 0;


执行结果:
exit main
exit f2
exit f1

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

【中文标题】是否可以从 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" ) &gt;= 0 的问题,或者您也可以编写一个非常小的 C++ 进程与您的工具一起运行,充当看门狗并关闭该弹出窗口。但这不是一个非常干净的解决方案。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

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

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

【讨论】:

以上是关于QT如何设置程序运行完弹出消息框的主要内容,如果未能解决你的问题,请参考以下文章

QT--运行程序程序弹出The CDB process terminated

ASP中怎么弹出消息框

Qt 消息框显示在 Debian linux 的左上角

Qt 解决程序全屏运行弹窗引发任务栏显示

如何防止应用程序不显示多个取消消息框?

如何存储在 Qt 设置中?