簡體   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