2

WM_ENDSESSIONメッセージに問題があります。つまり、 WM_ENDSESSIONメッセージが送信されているときに、アプリケーション (WindowProc) のメイン ループから抜けたいと考えています。

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

...、しかし機能しません - アプリケーションはメインループを終了しません...

msdn で WM_QUERYENDSESSION と WM_ENDSESSION について読みましたが、役立つ情報が見つかりませんでした...

どこが間違っているのですか?

4

3 に答える 3

3

WM_QUERYENDSESSION に対して PostQuitMessage を呼び出すことは間違っていないと思います。

WM_ENDSESSION は世界の終わりです。その時点で後で作業を延期する (PostQuitMessage を呼び出す) のは遅すぎます。今すぐやらないと、その機会は二度とありません。また、あなたが何をしているのかを考えてください。Raymond Chen がかつて言ったように、「[WM_ENDSESSION に応答してアプリをクリーンアップすることは] 建物を取り壊す前にじゅうたんをスチーム クリーニングするのに時間をかけるようなものです。無駄な労力です。」

WM_QUERYENDSESSION は、ウィンドウにユーザーと対話する最後のチャンスを与えます。ユーザーに代わってアプリを停止することを決定し、正常に終了したいので、これがスケジュールを設定する最後の機会です。

更新しました

WM_QUERYENDSESSION への応答として PostQuitMessage に対しても機能するかどうかはわかりません。MSDN ドキュメントには、「システムが WM_QUERYENDSESSION メッセージの結果を処理した後、 WM_ENDSESSION メッセージがアプリケーションに送信される」と記載されています。

送信されたということは、メッセージ ポンプがメッセージをクラックしないことを意味します。もちろん、ドキュメントの作成者でさえ、 send と posted を混同することがよくあります

于 2011-04-20T20:27:16.760 に答える
0

特別な取り扱いは必要ありません。これらのメッセージを処理する代わりに、DefWindowProc を呼び出すだけです。

于 2011-04-20T22:13:30.187 に答える
-1

私は置くだろう

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

関数return 0;内にいる場合、置くとプログラムを終了する必要がありますmain()

于 2011-04-20T18:16:23.627 に答える