实验的原因: 想在托盘上接收windows退出或注销消息.
在原始demo中是可以的,那是个win32程序.
托盘中注册通知总是得到1702错误.
先记下, 有时间,做个实验。
<2011_1001>
参考资料:
Turn Off Monitor when PC is Locked
http://www.codeproject.com/KB/winsdk/Turn_OFF_Monitor_OnLock.aspx
可以以前搞错了, 弄个托盘和接收不到系统通知没有任何关系. 带上托盘也是可以收到消息通知的.
注册Windows消息通知和窗体程序没区别,也是注册到主窗口的句柄上。只是主窗体不显示而已.
INT ProcessWindowsSystemNotify(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, TAG_PROCESS_SYSTEM_NOTIFY * pProcess) { if(!pProcess->pDebugLog) goto END; switch (wParam) { case WTS_SESSION_UNLOCK: { /** 在WinXpSp3下, 不显示欢迎界面时, 三键锁定界面解锁时, 进入这里 */ TRACE_CODE_INFO(pProcess->pDebugLog, _T("WTS_SESSION_UNLOCK")); } break; case WTS_SESSION_LOCK: { /** 在WinXpSp3下, 不显示欢迎界面时, 三键锁定界面锁定时, 进入这里 */ TRACE_CODE_INFO(pProcess->pDebugLog, _T("WTS_SESSION_LOCK")); } break; case WTS_SESSION_LOGON: { /** 一个账户收不到本身的此消息 */ TRACE_CODE_INFO(pProcess->pDebugLog, _T("WTS_SESSION_LOGON")); } break; case WTS_SESSION_LOGOFF: { /** 一个账户收不到本身的此消息 */ TRACE_CODE_INFO(pProcess->pDebugLog, _T("WTS_SESSION_LOGOFF")); } break; case WTS_REMOTE_CONNECT: { /** 在WinXpSp3下, 同一个账户, 已经登录过, * 用远程桌面用同一个账户远程登入, 进入这里 */ TRACE_CODE_INFO(pProcess->pDebugLog, _T("WTS_REMOTE_CONNECT")); } break; case WTS_REMOTE_DISCONNECT: { /** 在WinXpSp3下, 同一个账户, 已经登录过, * 用远程桌面用同一个账户远程登等出, 进入这里 */ TRACE_CODE_INFO(pProcess->pDebugLog, _T("WTS_REMOTE_DISCONNECT")); } break; case WTS_SESSION_REMOTE_CONTROL: { /** 启动的晚, 没有收到此消息 */ TRACE_CODE_INFO(pProcess->pDebugLog, _T("WTS_SESSION_REMOTE_CONTROL")); } break; case WTS_CONSOLE_DISCONNECT: { /** 别的用户登录时, 已经登录的用户控制连接断开, 进入这里 */ TRACE_CODE_INFO(pProcess->pDebugLog, _T("WTS_CONSOLE_DISCONNECT")); } break; case WTS_CONSOLE_CONNECT: { /** 用户登录后, 进入这里 */ TRACE_CODE_INFO(pProcess->pDebugLog, _T("WTS_CONSOLE_CONNECT")); } break; default: { pProcess->pDebugLog->logv(_T("<%s><%d> <%s>=<%d> <%s>=<%d>"), __WFILE__, __LINE__, _T("wParam"), wParam, _T("lParam"), lParam); } break; }; END: return S_OK; }
系统登出的消息, GINA程序可以得到.