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

时间:2011-05-02 06:39:29

标签: windows winapi visual-c++ windows-services background-process

我们正在Windows上使用Visual Studio 2005开发C ++应用程序(许多MFC)。

有时会发生我们的夜间构建和/或单元测试,因为某些应用程序或帮助工具的某些部分会在构建命中的角落案例中打开一个消息框。

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

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

我认为大多数情况下应用会显示意外的弹出式消息,它最终会调用MessageBox*中的user32.dll个函数之一,它可能只是“神奇地”拥有这些某些登录会话的功能是否失败? (只是一个疯狂的想法。)

显然,“正确”的修复方法是让没有打开任何对话框的东西,但是使用第三方工具并不总是可行的,并且使用我们的工具可以更好地进行失败的单元测试这告诉我“非法”测试打开了一个消息框,而不是单元测试。

(附注:我们使用Boost.Test进行单元测试,使用FinalBuilder进行自动构建脚本。)

注意:删除原始标签[持续集成构建自动化自动化测试]并将问题重新定义为更加以流程为中心。

2 个答案:

答案 0 :(得分:1)

我们使用AutoIt自动关闭商业run-as-windows-service应用程序中的对话框。描述了这个概念,这里有一些示例脚本: http://www.coretechnologies.com/products/AlwaysUp/AutoIt/

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

答案 1 :(得分:1)

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