【问题标题】:Preventing blocking dialogs/message boxes/hanging GUI from non-interactive processes on Windows?防止在 Windows 上的非交互式进程中阻止对话框/消息框/挂起 GUI?
【发布时间】:2011-05-02 06:39:29
【问题描述】:

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

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

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

有什么方法可以让 Windows 阻止应用打开对话框?或者可能是一个监视服务会话的工具,该工具会自动终止任何打开对话框的应用程序?

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

显然,“正确”的解决方法是让内容不打开任何对话框,但使用 3rd 方工具并不总是可能的,使用我们的工具,失败单元测试会更好这告诉我测试“非法”打开了一个消息框,而不是 hanging 单元测试。

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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      相关资源
      最近更新 更多