Windows下MFC应用如何捕获切换登录用户会话事件
MFC捕获Windows切换用户事件的解决方案
Windows切换用户属于终端服务会话切换事件,WM_QUERYENDSESSION仅覆盖关机、重启、注销类事件,无法捕获会话切换,你需要通过WM_WTSSESSION_CHANGE消息实现捕获,具体步骤如下:
- 第一步:添加依赖项
首先引入头文件和链接依赖库,在你的对话框实现文件顶部添加如下代码:#include <wtsapi32.h> #pragma comment(lib, "wtsapi32.lib") - 第二步:注册会话变更通知
在对话框的OnInitDialog初始化函数中添加注册逻辑,让系统向你的窗口发送会话变更消息:BOOL CYourDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 其他原有初始化逻辑 // 注册接收会话切换通知 WTSRegisterSessionNotification(m_hWnd, NOTIFY_FOR_THIS_SESSION); return TRUE; } - 第三步:添加消息映射和处理函数声明
在对话框类的头文件中添加消息处理函数声明:
在对话框的消息映射表中添加消息绑定:afx_msg LRESULT OnWTSSessionChange(WPARAM wParam, LPARAM lParam);BEGIN_MESSAGE_MAP(CYourDialog, CDialogEx) // 其他原有消息映射 ON_MESSAGE(WM_WTSSESSION_CHANGE, &CYourDialog::OnWTSSessionChange) END_MESSAGE_MAP() - 第四步:实现消息处理函数,判断切换用户事件
LRESULT CYourDialog::OnWTSSessionChange(WPARAM wParam, LPARAM lParam) { switch (wParam) { case WTS_CONSOLE_DISCONNECT: // 当前用户被切换到后台,即触发了切换用户操作 // 此处添加你的业务逻辑 break; case WTS_CONSOLE_CONNECT: // 用户切回当前登录会话 // 此处添加你的业务逻辑 break; // 可选:监听其他会话事件 // case WTS_SESSION_LOCK: // 会话锁定 // case WTS_SESSION_UNLOCK: // 会话解锁 // case WTS_SESSION_LOGOFF: // 用户注销 } return 0; } - 第五步:退出前注销通知
在对话框的OnDestroy函数中添加注销逻辑,避免资源泄漏:void CYourDialog::OnDestroy() { CDialogEx::OnDestroy(); // 注销会话通知 WTSUnRegisterSessionNotification(m_hWnd); }
注意:如果需要监听所有会话的切换事件而非仅当前用户的会话,可以将
WTSRegisterSessionNotification的第二个参数改为NOTIFY_FOR_ALL_SESSIONS。
内容的提问来源于stack exchange,提问作者Karuthedan
相关产品推荐
相关产品推荐

