繁体   English   中英

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

[英]Preventing blocking dialogs/message boxes/hanging GUI from non-interactive processes on Windows?

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

有时,我们的夜间构建和/或单元测试会挂起,因为某些应用程序或帮助工具的某些部分会在构建遇到的极端情况下打开一个消息框。

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

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

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

显然,“正确”的解决方法是让东西不打开任何对话框,但是使用 3rd 方工具并不总是可能的,使用我们的工具,如果单元测试失败并告诉我测试“非法”打开了消息框比单元测试。

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

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

我们使用 AutoIt 来自动关闭我们的商业 run-as-windows-service 应用程序中的对话框。 描述了该概念,并在此处提供了一些示例脚本: http://www.coretechnologies.com/products/AlwaysUp/AutoIt/

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM