如何为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
相关产品推荐
相关产品推荐

