mirror of
https://github.com/reactos/reactos.git
synced 2025-01-07 14:51:00 +00:00
ff9649d7d7
-Implement closing any dialog that shows and stays visible for some time. This way rosautotest can now continue if a test application crashes or asserts. svn path=/trunk/; revision=50381
97 lines
2.5 KiB
C++
97 lines
2.5 KiB
C++
/*
|
|
* 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);
|
|
}
|