3

クリーンアップを実行できるように、Windowsログオフイベントをキャッチしたいと思います。私WindowProcはこのように見えます:

switch (uMsg){
case WM_ENDSESSION:
case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
// other messages
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);

のメッセージループはWinMain次のようになります。

for(;;){
    bool bTerminate = false;
    while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
        if(msg.message == WM_QUIT){
            bTerminate = true;
        }
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    if(bTerminate){
        break;
    }
    // do other stuff
    Sleep(10);
}
FILE * fout;
fopen_s(&fout, "C:\\success.txt", "w"); // simulating cleanup actions
fclose(fout);
ExitProcess(0);

意図されたメカニズムは、メインメッセージループを受信さWindowProcせ、ループを中断し、プログラムをクリーンアップに送信することです。プログラムを終了すると(つまり送信)、プログラムは作成しますが、プログラムが実行されていてログオフ(送信)すると、作成されません。PostQuitMessageWM_QUITWM_DESTROYsuccess.txtWM_ENDSESSION

私も調べましたWM_QUERYENDSESSIONが、MSDNは、「各アプリケーションは、このメッセージを受信するとすぐに戻るTRUEか、メッセージFALSEを受信するまでクリーンアップ操作を延期する必要がありWM_ENDSESSIONます」と述べています。

4

2 に答える 2

3

WM_ENDSESSION処理によって、アプリケーションがメッセージループを終了する機会が実際に与えられるわけではありません。メッセージの送信後に、システムがTerminateProcessを呼び出すと想定する必要がありWM_ENDSESSIONます。

したがって、アプリケーションが実行する必要のあるクリーンアップは、ウィンドウプロシージャから戻る前に実行する必要があります。

于 2012-10-21T23:36:21.683 に答える