0

我們在Windows上用Visual Studio 2005開發C++應用程序(很多MFC)。防止Windows上的非交互式進程阻止對話框/消息框/掛起GUI?

偶爾會出現我們的夜間構建和/或單元測試掛起的問題,因爲某些應用程序或幫助程序工具的某些部分會在由構建命中的角落案例中打開消息框。

由於沒有附加任何桌面會話運行自動化的東西(通過Windows服務),顯然沒有人可以確認 - 甚至讀取 - GUI消息。

有什麼辦法讓Windows阻止應用程序打開對話框?或者,也許是一種觀看服務會話的工具,可自動殺死任何打開對話框的應用程序?

我在想,大多數情況下,應用程序顯示意外的彈出消息,它將最終從user32.dll調用MessageBox*函數之一,它可能會「奇蹟般地」使這些函數在某些登錄時失敗 - 會議? (只是一個瘋狂的想法。)

很明顯,「正確的」修復方法是不打開任何對話框的東西,但對於第三方工具,它並不總是可能的,並且與我們的工具,它會更好地有一個失敗單元測試,告訴我測試「非法」打開一個消息框比有懸掛單元測試。

(旁註:我們正在使用如Boost.Test我們的單元測試和的FinalBuilder我們的自動構建腳本。)

注意:刪除原標籤[持續集成構建的自動化自動化的測試]和改變的問題更加以過程爲中心。

+0

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/ef65c750-1db8-4a42-9c73-beaee390cef4 – 2011-05-03 11:41:36

+0

也許:http://msdn.microsoft.com/en-us /library/ms940850%28v=WinEmbedded.5%29.aspx – 2011-09-15 15:30:19

+0

@Hans ...這個鏈接似乎是'Windows XP Embedded' – 2011-09-19 12:47:17

回答

1

您可以在每個將鉤子放入MessageBoxA和MessageBoxW的進程中加載​​一個DLL。您可以手動或通過Detours庫進行此操作。然後,您可以直接返回而不調用實際函數,或者甚至可以實現某種形式的日誌記錄以通知您的CI錯誤。

1

我們使用AutoIt在我們的商業運行窗口服務應用程序中自動關閉對話框。這個概念的描述和一些示例腳本都可以在這裏: http://www.coretechnologies.com/products/AlwaysUp/AutoIt/

注意一些AutoIt的功能在會話0(例如WinActivate)正常工作,但你通常可以找到替代品。一定要在Session 0中測試!