Я их породил, я их и...
От: Мыкола Россия  
Дата: 15.10.02 11:58
Оценка:
Здравствуйте, уважаемые!
Мне тут понадобилась возможность принудительно позакрывать все диалоги в моем приложении. Покопался в форумах, что-то по этому поводу было, но проблемма так и не была решена. Набросал такую функцию:

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 только что прибитого окна).
Может, кто-нибудь подскажет мне недостающее звено?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.