1、MFC::onTimer: 当注销时,onTimer事件将失效;怀疑当系统注销时,系统将窗口销毁了,而OnTimer是居于系统发送的ON_WM_TIMER来告诉窗口执行的回调函数的;即当timer时间到时,系统发送ON_WM_TIMER消息,而此时窗口被销毁了,接收不到对应的消息,故无法执行回调;
问题的处理方案:可以用timeSetEvent替换OnTimer,timeSetEvent不依赖系统消息与窗口句柄实现。具体参见MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/dd757634(v=vs.85).aspx
2、ExitWindowsEX() :该函数是居于登录用户来做的:注销、关机、重启系统;如果当前用户已被注销,则在注销后调用以上程序执行关机、重启等操作将失败;(LockWorkStation在注销时,也执行失败)
问题的处理方案:可以用InitiateSystemShutdown函数替换;具体参见:MSDN:https://docs.microsoft.com/zh-cn/windows/desktop/Shutdown/system-shutdown-functions;
3、监视系统注销操作:参考:https://blog.csdn.net/yangyang031213/article/details/74668458
3.1、注册Session变化的触发器:WTSRegisterSessionNotification(在初始化时注册)
如:WTSRegisterSessionNotification(m_hWnd, NOTIFY_FOR_THIS_SESSION);
3.2、重写窗口消息函数:WindowProc
3.3、关闭、退出时清理:
WTSUnRegisterSessionNotification(m_hWnd);
通过以上方法可以监听:登录、注销、锁屏、用户切换、睡眠、休眠、唤醒或电源设置改变等操作