SENS:系统事件通知服务 和 WMI 支持灵活而有效的移动网络计算( 二 )


支持瞬态网络的应用程序还需要知道用户何时与其计算机进行交互 。如果您的应用程序在用户与计算机进行交互的同时收集数据,则系统将会显得非常缓慢 。
要避免这种情况,您只能在确保计算机空闲的情况下执行后台处理 。只要用户开始与设备进行交互,就立即停止后台处理 。这将需要有某种快速启动和停止后台处理的方法,以及一种保存当前状态以供以后进行处理的方法 。
返回页首
正如您可能从其名称中猜到的,SENS 是各种系统事件的事件发布程序 。SENS 仅在2000 和XP 中可用(有一个例外,我将稍后予以说明) 。SENS 使用 COM+ 事件通知来投递其事件 。基于一种松耦合的发布程序-订户模型,COM+ 事件是对 COM 中流行的旧的连接点技术的改进 。
三个主要接口负责处理 SENS 所激发的通知: 负责处理网络连接/断开连接通知; 管理交互性用户通知;最后,处理电源状态通知 。
在网络被连接或断开连接时以及在目标变得可访问时引发事件 。这些事件通过接口传递给订户 。与 SENS 的其他组件不同,通知可在任何 32 位平台上使用(前提是您安装了5.5 或更高版本) 。
与引发的每个事件一起,可以提供任何可用的优质连接 (QOC) 信息 。QOC 信息包括网络链接的速度 。因为移动计算机在任一给定时间都可能连接到不同的网络,从而产生具有不同速度的链接,所以可以使用链接速度信息来最明智地决定传输数据的方式 。
例如,如果低速连接可用,则应用程序可能决定在发送信息之前将所有信息进行压缩 。在这种情况下,虽然要花费一些时间来压缩和解压缩信息,但总比阻塞低带宽网络要好 。另一方面,可以使用高速连接发送未压缩的信息 。
让我们更详细地考察一下接口:
HRESULT ISensNetwork::ConnectionMade (BSTR bstrConnection,ULONG ulType, LPSENS_QOCINFO pQOCInfo);
该方法在建立网络连接时调用 。第一个参数命名该连接,例如“LAN ” 。第二个参数将返回 0 (LAN) 或 1 (WAN) 。QOC 数据作为指向第三个和最后一个参数的指针传入 。结构如下所示:
typedef struct _SENS_QOCINFO{DWORD dwSize;DWORD dwFlags;DWORD dwOutSpeed;DWORD dwInSpeed;} SENS_QOCINFO;
成员应返回对网络速度的定性描述,即:高、中或低 。不过,返回该信息的方式未见说明 。成员和返回传出和传入的带宽(单位是字节/秒) 。当没有任何可用的 QOC 信息时,将调用的以下成员:
HRESULT ConnectionMadeNoQCInfo(BSTR bstrConnection, ULONG ulType);
在试用之后,我发现该接口的工作方式使其几乎无法在无线网络中使用(后面将有更为详细的说明) 。幸而,可以使用一个优秀的替代接口,我也将对其进行讨论 。
返回页首
概述了用户如何与系统进行交互 。在用户登录或注销、屏幕锁定或解除锁定、屏幕保护程序启动或停止、外壳程序启动时通知订户 。
所有方法都只向订户提供一个参数:用户的登录名 。下面是的大量方法的列表:
HRESULT ISensLogon::Logon (BSTR bstrUserName);HRESULT ISensLogon::Logoff (BSTR bstrUserName);HRESULT ISensLogon::DisplayLock (BSTR bstrUserName);HRESULT ISensLogon::DisplayUnLock (BSTR bstrUserName);HRESULT ISensLogon::StartScreenSaver (BSTR bstrUserName);HRESULT ISensLogon::StopScreenSaver (BSTR bstrUserName);HRESULT ISensLogon::StartShell (BSTR bstrUserName);
上面列出的每个通知都在触发它的事件已经发生后发送 。例如,方法在系统已经启动屏幕保护程序后调用 。如果您希望在事件发生之前将其捕获,则该通知将一点用处也没有 。这适用于所有通知 。
和事件每当屏幕显示被用户锁定时发送 。用户通常通过按 Ctrl-Alt-Del 按键并随后单击 Lock按钮来保护显示 。然后,可以通过使用用户名和密码重新登录来将显示解除锁定 。