C :响应Windows记录的清理操作

C++: cleanup actions in response to Windows logoff

本文关键字:操作 记录 响应 Windows      更新时间:2023-10-16

我想捕获一个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说:"收到此消息后,每个应用程序都应立即返回TRUEFALSE,并将任何清理操作推迟到收到WM_ENDSESSION消息。"

WM_ENDSESSION处理实际上并没有使您的应用程序有机会退出消息循环。您应该在发送WM_ENDSESSION消息后假设系统调用终止程序。

因此,您的申请需要进行的任何清理都应在从窗口过程中返回之前进行。

在Windows UI应用程序中,您可以使用: LRESULT CMainDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{ if(message == WM_ENDSESSION) { if(lParam == ENDSESSION_LOGOFF) { /*Handle event*/ } } return CDialogEx::WindowProc(message, wParam, lParam); }
您可以从此MSDN链接获得更多帮助。