You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为WM_QUERYENDSESSION处理器添加参数以区分重启与注销

在MFC中修改WM_QUERY_END_SESSION处理函数以区分重启/注销

要实现区分系统重启、注销等操作,你需要手动调整MFC的消息映射和处理函数,具体步骤如下:

1. 更新头文件中的函数声明

找到你的窗口类(比如CMainFrame或自定义对话框类)的头文件,删除ClassWizard生成的默认声明:

afx_msg BOOL OnQueryEndSession();

替换为带参数的自定义处理函数声明:

afx_msg LRESULT MyOnQueryEndSession(WPARAM wParam, LPARAM lParam);

2. 修改消息映射表

在窗口类的cpp文件中,定位到BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间的代码,删除默认的消息映射项:

ON_WM_QUERYENDSESSION()

添加手动消息映射,用ON_MESSAGE宏将WM_QUERY_END_SESSION绑定到你的自定义函数:

ON_MESSAGE(WM_QUERY_END_SESSION, &CYourWndClass::MyOnQueryEndSession)

注意把CYourWndClass替换成你实际的窗口类名称。

3. 实现自定义处理函数

在cpp文件中编写函数体,通过lParam的标志位判断系统操作类型:

LRESULT CYourWndClass::MyOnQueryEndSession(WPARAM wParam, LPARAM lParam)
{
    // 解析操作类型标志
    bool isLogoff = (lParam & ENDSESSION_LOGOFF) != 0;
    bool isRestart = (lParam & ENDSESSION_RESTART) != 0;
    bool isShutdown = (lParam & ENDSESSION_SHUTDOWN) != 0;

    // 根据不同操作执行对应逻辑
    if (isLogoff)
    {
        // 处理注销相关逻辑
    }
    else if (isRestart)
    {
        // 处理重启相关逻辑
    }

    // 返回TRUE允许会话结束,返回FALSE阻止操作
    return TRUE;
}

提示:ENDSESSION_*系列宏定义在<winuser.h>中,确保代码已包含该头文件。

关键说明

  • MFC默认的ON_WM_QUERYENDSESSION宏会自动封装参数,仅暴露无参的处理函数,无法获取lParam里的操作标志;手动使用ON_MESSAGE宏可以直接拿到原始消息参数。
  • 返回值规则:返回非0值(如TRUE)表示允许系统执行结束会话操作,返回0(如FALSE)表示阻止操作。

内容的提问来源于stack exchange,提问作者Tom Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:40:07