防止在Windows上阻止非交互式进程中的对话框/消息框/挂起GUI?

我们正在Windows上用Visual Studio 2005开发C ++应用程序(大量的MFC)。

有时候会发生我们每晚的构build和/或unit testing挂起,因为某些应用程序或帮助程序工具的某些部分打开一个消息框在一个由构build命中的angular落案例。

由于自动化的东西运行(通过Windows服务)没有附加任何桌面会话,显然没有人可以确认,甚至读取GUI消息。

有没有办法让Windows阻止应用程序打开对话框? 或者,也许是一个工具,观看服务会话自动杀死任何应用程序,打开一个对话框?

我在想,大多数情况下,应用程序显示意外的popup消息,它将最终从user32.dll调用其中一个MessageBox*函数,它可能只是“神奇地”可能有这些function失败的某个login会话? (只是一个疯狂的想法。)

显然,“正确的”解决方法是让东西不打开任何对话框,但是使用第三方工具并不总是可能的,使用我们的工具,如果有一个失败的unit testing会告诉我testing“非法”打开消息框比有unit testing。

(边注:我们使用Boost.Test进行unit testing,FinalBuilder使用我们的自动构build脚本。)

注意:删除了原始标签[连续集成构build – 自动化自动化testing]并将问题改为更加以stream程为中心。

Solutions Collecting From Web of "防止在Windows上阻止非交互式进程中的对话框/消息框/挂起GUI?"

您可以在每个将消息放入MessageBoxA和MessageBoxW的进程中加载​​一个DLL。 您可以手动或通过Detours库执行此操作。 然后,您可以直接返回而不调用实际函数,或者甚至可以实现某种形式的日志记录以通知您的配置项错误。

我们使用AutoIt在我们的商业运行Windows服务应用程序中自动关闭对话框。 这个概念被描述和一些示例脚本可在这里: http : //www.coretechnologies.com/products/AlwaysUp/AutoIt/

请注意,某些AutoIt函数在会话0(例如WinActivate)中无法正常工作,但您通常可以找到替代方法。 一定要在Session 0中测试!