Здравствуйте, уважаемые!
Мне тут понадобилась возможность принудительно позакрывать все диалоги в моем приложении. Покопался в форумах, что-то по этому поводу было, но проблемма так и не была решена. Набросал такую функцию:
BOOL CloseAllDialogs()
{
HWND hWnd=GetLastActivePopup();
if(hWnd==m_hWnd) return TRUE;
HANDLE hTimer=::CreateWaitableTimer(NULL,FALSE,NULL);
if(hTimer==NULL) return FALSE;
LARGE_INTEGER t; t.QuadPart=-200; int cntr=100;
while((hWnd!=m_hWnd)&&(cntr>0))
{
::EndDialog(hWnd,IDCANCEL);
if(!::SetWaitableTimer(hTimer,&t,0,NULL,NULL,FALSE)) break;
AtlWaitWithMessageLoop(hTimer);
// ???
hWnd=GetLastActivePopup();
cntr--;
}
::CloseHandle(hTimer);
return (hWnd==m_hWnd);
}
Таймер создаю и жду с помощью AtlWaitWithMessageLoop чтобы не дублировать код цикла ожидания сообщений. А сообщения надо пообрабатывать чтобы диалог реально разрушился (вычитал в MSDN'е что EndDialog() только взводит флаг, который анализируется системой при обработке первого сообщения).
Тем не менее, вызов GetLastActivePopup() внутри цикла не возвращает мне m_hWnd, как я ожидал (похоже, там так и остается HWND только что прибитого окна).
Может, кто-нибудь подскажет мне недостающее звено?