Проблема с сообщением WM_ENDSESSION - PullRequest
2 голосов
/ 20 апреля 2011

У меня проблема с WM_ENDSESSION сообщением.А именно, я хотел бы выйти из основного цикла приложения (WindowProc), когда отправляется сообщение WM_ENDSESSION ... Итак, я написал что-то вроде этого:

LRESULT CALLBACK windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    //...       
    case WM_QUERYENDSESSION: return TRUE;       
    case WM_ENDSESSION: 
         if(wParam) PostQuitMessage(0);         
    break;    
    default:
        return DefWindowProc(hwnd,msg,wParam,lParam);
    }

    return 0;
}

..., но это не работает - приложение не выходит из основного цикла ...

Я читал о WM_QUERYENDSESSION и WM_ENDSESSION в msdn, но не смог найти никакой полезной информации ...

Есть идеи, где ошибка?

Ответы [ 3 ]

3 голосов
/ 21 апреля 2011

Я не думаю, что неправильно вызывать PostQuitMessage в ответ на WM_QUERYENDSESSION.

WM_ENDSESSION - это конец света. В этот момент уже слишком поздно откладывать работу на потом (вызывая PostQuitMessage). Сделай это сейчас, или у тебя никогда не будет шанса сделать это. Кроме того, подумайте, что вы делаете. Как однажды сказал Рэймонд Чен: «[очистка вашего приложения в ответ на WM_ENDSESSION] это все равно, что потратить время на чистку ковров паром перед тем, как разрушить здание. Напрасные усилия».

WM_QUERYENDSESSION предоставляет вашему окну последний шанс взаимодействовать с пользователем. Вы решили от имени пользователя, что ваше приложение умрет, и вы хотите изящно выйти, так что это ваша последняя возможность запланировать его.

Обновлено

Я не знаю, будет ли это работать на PostQuitMessage в ответ на WM_QUERYENDSESSION. Состояние документа MSDN: «Сообщение WM_ENDSESSION отправлено приложению после того, как система обработает результаты сообщения WM_QUERYENDSESSION.»

Отправлено означает, что насос сообщений не получает трещины в сообщениях. Конечно, даже авторы документов часто путают отправлено и отправлено .

0 голосов
/ 21 апреля 2011

Вам не нужна особая обработка. Просто вызовите DefWindowProc вместо обработки этих сообщений.

0 голосов
/ 20 апреля 2011

Я бы поставил

switch(msg)
{
    //...  
    case WM_ENDSESSION:  
        if(wParam) PostQuitMessage(0);  
        return 0;  
    //...  
}

установка return 0; должна выйти из программы, если вы находитесь в функции main()

...