Problema con il messaggio WM_ENDSESSION

Ho un problema con il messaggio WM_ENDSESSION . Vale a dire vorrei uscire dal ciclo principale dell’applicazione (WindowProc) quando il messaggio WM_ENDSESSION sta inviando … Quindi, ho scritto qualcosa del genere:

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; } 

…, ma non funziona – l’applicazione non esce dal ciclo principale …

Ho letto di WM_QUERYENDSESSION e WM_ENDSESSION su msdn, ma non sono riuscito a trovare alcuna informazione utile …

Qualche idea, dov’è l’errore?

    Non penso che sia sbagliato chiamare PostQuitMessage in risposta a WM_QUERYENDSESSION.

    WM_ENDSESSION è la fine del mondo. A quel punto è troppo tardi per posticipare il lavoro fino a un momento successivo (chiamando PostQuitMessage). Fallo ora o non avrai mai la possibilità di farlo. Inoltre, considera quello che stai facendo. Come disse una volta Raymond Chen, “[ripulire la tua app in risposta a WM_ENDSESSION è] come avere il tempo di pulire a vapore i tappeti prima di demolire l’edificio.

    WM_QUERYENDSESSION garantisce alla tua finestra l’ultima possibilità di interagire con l’utente. Hai deciso per conto dell’utente che la tua app morirà e che vuoi uscire con grazia, quindi questa è la tua ultima opportunità per programmarla.

    aggiornato

    Non so che funzionerà anche con PostQuitMessage in risposta a WM_QUERYENDSESSION. Lo stato dei documenti MSDN, “Il messaggio WM_ENDSESSION viene inviato a un’applicazione dopo che il sistema elabora i risultati del messaggio WM_QUERYENDSESSION.”

    Inviato implica che il messaggio pompa non ottiene una crepa ai messaggi. Naturalmente, anche gli autori dei documenti spesso confondono inviati e postati .

    metterei

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

    rimettendo return 0; dovrebbe uscire dal programma, se ci si trova nella funzione main()

    Non è necessario alcun trattamento speciale. Basta chiamare DefWindowProc invece di gestire questi messaggi.