防止在Windows上阻止非交互式进程的对话框/消息框/挂起GUI? 我们在Windows上开发Visual Studio 2005的C++应用程序(很多MFC)。

防止在Windows上阻止非交互式进程的对话框/消息框/挂起GUI? 我们在Windows上开发Visual Studio 2005的C++应用程序(很多MFC)。,windows,winapi,visual-c++,windows-services,background-process,Windows,Winapi,Visual C++,Windows Services,Background Process,有时,我们的夜间构建和/或单元测试会挂起,因为某个应用程序或助手工具的某些部分会在构建命中的角落中打开一个消息框 由于自动运行的东西(由Windows服务)没有连接任何桌面会话,显然没有人能够确认——甚至读取——GUI消息 有没有办法让Windows阻止应用打开对话框?或者是一个监视服务会话的工具,它会自动终止任何打开对话框的应用程序 我在想,在大多数情况下,当应用程序显示意外的弹出消息时,它最终会从user32.dll调用一个MessageBox*函数,并且可能只是“神奇地”让这些函数在某个登

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

由于自动运行的东西(由Windows服务)没有连接任何桌面会话,显然没有人能够确认——甚至读取——GUI消息

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

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

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

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


注意:删除了原始标记[continuous integration build automation automated tests],并将问题重新表述为更以流程为中心

我们使用AutoIt自动关闭商业运行windows服务应用程序中的对话框。下面介绍了该概念,并提供了一些示例脚本:


请注意,某些AutoIt功能在会话0中无法正常工作(例如WinActivate),但您通常可以找到其他功能。确保在会话0中进行测试

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

也许:@Hans。。。该链接似乎是针对
windowsxpembedded
的,这就是为什么它是一个可能的链接。你试过了吗?