クリーンアップを実行できるように、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
せ、ループを中断し、プログラムをクリーンアップに送信することです。プログラムを終了すると(つまり送信)、プログラムは作成しますが、プログラムが実行されていてログオフ(送信)すると、作成されません。PostQuitMessage
WM_QUIT
WM_DESTROY
success.txt
WM_ENDSESSION
私も調べましたWM_QUERYENDSESSION
が、MSDNは、「各アプリケーションは、このメッセージを受信するとすぐに戻るTRUE
か、メッセージFALSE
を受信するまでクリーンアップ操作を延期する必要がありWM_ENDSESSION
ます」と述べています。