实验的原因: 想在托盘上接收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程序可以得到.