winapi - Forhindre blokering af dialoger/meddelelsesbokse/hængende GUI fra ikke-interaktive processer på Windows?

Indlæg af Hanne Mølgaard Plasc

Problem



Vi udvikler C ++ apps (masser af MFC) med Visual Studio 2005 på Windows.


Fra tid til anden sker det, at vores natlige opbygninger og/eller enhedsprøver hænger, fordi en del af et app- eller hjælperværktøj åbner en meddelelsesboks i et hjørnehus, der rammes af bygningen.


Da de automatiske ting køres (ved en Windows Service) uden nogen desktop session, kan ingen af ​​dem selvfølgelig bekræfte - eller endda læse - GUI-meddelelserne.


Er der nogen måde at få Windows til at forhindre apps i at åbne dialoger? Eller måske et værktøj, der ser en service session, der automatisk dræber enhver app, der åbner en dialogboks?


Jeg tænker på, at de fleste tilfælde, hvor apps viser uventede popup-meddelelser, vil det ende med at kalde en af ​​MessageBox* -funktionerne fra user32.dll, og det kan måske kun være 'magisk', at disse funktioner mislykkes en bestemt login-session? (Bare en vild ide.)


Det er klart, at den rigtige løsning er at have ting, der ikke åbner nogen dialoger, men med tredjeparts værktøjer er det altid muligt, og med vores værktøjer ville det være pænere at have en failing enhedsprøve, der fortæller mig testen 'ulovligt' åbnet en meddelelsesboks end en hængende enhedsprøve.


(Side noter: Vi bruger Boost.Test for vores enhedsprøver og FinalBuilder til vores automatiske build scripts.)


Bemærk: Fjernet originale tags [[automatiske automatiske tests med kontinuerlig integration]] og omformuleret spørgsmål for at være mere procescentreret.

Bedste reference


Du kan indlæse en DLL i hver af de processer, der sætter en krog på MessageBoxA og MessageBoxW. Du kan enten gøre det manuelt eller via detours biblioteket. Du kan enten enten få det til at returnere med det samme uden at ringe til den rigtige funktion, eller du kan endda gennemføre en form for logføring til at underrette dit CI om fejlen.

Andre referencer 1


Vi bruger AutoIt til automatisk at afvise dialoger i vores kommercielle run-as-windows-service applikation. Konceptet er beskrevet, og der er nogle eksempler på scripts her:
http://www.coretechnologies.com/products/AlwaysUp/AutoIt/[3]


Bemærk, at nogle af AutoIt-funktionerne fungerer ikke korrekt i Session 0 (fx WinActivate), men du kan normalt finde alternativer. Sørg for at teste i Session 0!