Raymond Chen 2006年01月04日
开发成本:检测会话状态变化,如锁定的计算机工作站
在开发过程中,另一个需要考虑的技术挑战是如何与快速用户切换和终端服务友好地协作。当工作站被锁定或用户会话断开时,您应该停止非关键的定时器,减少后台活动,并总体上使程序进入一种休眠状态。如果您已经采用了仅在窗口可见时才进行重绘的策略,那么您将自动获得这些好处,因为锁定的工作站和断开的会话不会发送重绘消息。
如果您还有其他需要在用户锁定计算机或断开连接时减少或停止的活动,您可以注册以在状态变化时接收通知。了解这些状态变化也很重要,这样您就可以知道您的显示是本地的还是远程的。正如我们上次讨论的,通过远程桌面连接进行绘图比在本地显示上要慢得多,因为所有的位图都需要通过网络传输到远程桌面客户端。
由于锁定计算机和断开会话会取消使用视觉反馈来指示程序状态的能力,我们将使用声音反馈。从我们的新测试程序开始,并进行以下修改:
#include <wtsapi32.h>
LRESULT RootWindow::OnCreate()
{
WTSRegisterSessionNotification(m_hwnd, NOTIFY_FOR_THIS_SESSION);
return 0;
}
LRESULT RootWindow::HandleMessage(
UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
// ...
case WM_WTSSESSION_CHANGE:
switch (wParam) {
case WTS_CONSOLE_DISCONNECT:
case WTS_REMOTE_DISCONNECT:
case WTS_SESSION_LOCK:
case WTS_SESSION_LOGOFF:
Beep(440, 250); break;
case WTS_CONSOLE_CONNECT:
case WTS_REMOTE_CONNECT:
case WTS_SESSION_UNLOCK:
case WTS_SESSION_LOGON:
Beep(880, 250); break;
}
break;
// ...
}
}
在这个程序中,我们在创建主窗口时注册了会话通知,并在窗口处理程序中监听会话变化消息。如果我们检测到“离开”消息,我们会发出一个低沉的哔声;如果我们检测到“回来”消息,我们会发出一个高音的哔声。
运行这个程序,然后锁定工作站或使用快速用户切换切换用户。您应该会听到一个低沉的哔声(尽管如果您执行的操作有系统声音,您可能需要仔细听,因为低沉的哔声会与该声音混合)。当您切换回来时,您应该会听到一个高音的哔声。
当然,一个实际的应用程序会通过启动或停止其后台任务来响应这些通知。这个程序的目的仅仅是为了演示如何首先获取这些通知。