--- /dev/null
+/*
+ * PROJECT: ReactOS Automatic Testing Utility
+ * LICENSE: GNU GPLv2 or any later version as published by the Free Software Foundation
+ * PURPOSE: Class for managing all the configuration parameters
+ * COPYRIGHT: Copyright 2011
+ */
+
+#include "precomp.h"
+
+BOOL CALLBACK PrintWindow(HWND hwnd, LPARAM lParam)
+{
+ CHAR WindowTitle[100];
+ int lenght;
+
+ lenght = GetWindowTextA(hwnd, WindowTitle, 100);
+ if(lenght == 0)
+ return TRUE;
+
+ StringOut( string(WindowTitle) + "\n" );
+
+ return TRUE;
+}
+
+
+void CALLBACK WinEventProc(HWINEVENTHOOK hWinEventHook,
+ DWORD event,
+ HWND hwnd,
+ LONG idObject,
+ LONG idChild,
+ DWORD dwEventThread,
+ DWORD dwmsEventTime)
+{
+ /* make sure we got the correct event */
+ if(event == EVENT_SYSTEM_DIALOGSTART)
+ {
+ /* wait for some time to make sure that the dialog is hung */
+ Sleep(30 * 1000);
+
+ /* Check if it is still open */
+ if(IsWindow(hwnd))
+ {
+ /* Print an error message */
+ StringOut("Closing following dialog box:\n");
+ PrintWindow(hwnd, NULL);
+ EnumChildWindows(hwnd, PrintWindow, NULL);
+
+ /* Close the dialog */
+ SendMessage(hwnd, WM_CLOSE, 0, 0);
+ }
+ }
+}
+
+
+DWORD WINAPI DialogSurpassThread(LPVOID lpThreadParameter)
+{
+ MSG dummy;
+
+ /* Install event notifications */
+ SetWinEventHook(EVENT_SYSTEM_DIALOGSTART,
+ EVENT_SYSTEM_DIALOGSTART,
+ NULL,
+ WinEventProc,
+ 0,
+ 0,
+ WINEVENT_OUTOFCONTEXT);
+
+ while(GetMessage(&dummy, 0,0,0))
+ {
+ /* There is no need to dispatch messages here */
+ /* Actually this block will never be executed */
+ }
+
+ return 0;
+}
+
+CDialogSurpass::CDialogSurpass()
+{
+ /* Creat the trhead that will receive notifications */
+ hThread = CreateThread(NULL,
+ 0,
+ DialogSurpassThread,
+ NULL,
+ 0,
+ &ThreadID);
+}
+
+CDialogSurpass::~CDialogSurpass()
+{
+ /* Notify the thread to close */
+ PostThreadMessage(ThreadID, WM_QUIT, 0, 0);
+
+ /* Wait for it close */
+ WaitForSingleObject(hThread, INFINITE);
+
+ /* Now close its handle*/
+ CloseHandle(hThread);
+}