Windows Mobile 5.0 设备随附了远远超过 100 个不同的状态值,它们可以通过 State and Notification Broker API 获得。这些可用值提供各种各样的,与设备本身和标准 Windows Mobile 5.0 应用程序有关的信息。下表只是可以通过 State and Notification Broker 获得的信息的一部分示例:
•活动应用程序
•设备的 ActiveSync 状态
•当前电池电平
•是否有照相机连接到该设备
•是否插入了耳机
• Media Player 中当前播放的歌曲名称
•未读的 SMS 信息个数
•未读的电子邮件个数
•当前是否正在通话
•当前是否正在进行会议呼叫
•当前是否可以使用 GPRS 连接
•设备当前是否连接到 VPN
•未接电话呼叫的个数
•电话的移动运营商的名称
•当天预定的任务数
除了上述项以外,原始设备制造商 (OEM) 和应用程序开发人员还可以扩充该列表。开发人员可以轻松地设计应用程序以检索任何 State and Notification Broker API 存储值,并且如果需要的话,则开发人员可以设计应用程序以监视一个或多个值的更改。
State and Notification Broker 的基础实现依赖于注册表。每个提供程序都会创建一个注册表项,向该项添加值,以表示各个状态值。在提供程序创建该注册表项以后,State and Notification Broker 会监视该值的更改,并且自动通知已经注册了对该值的兴趣的所有各方。所有系统状态属性都存储在 HKEY_CURRENT_USER"System"State 或 HKEY_LOCAL_MACHINE"System"State 下面。这些项都被加以保护,允许不受信任的应用程序进行只读访问。应用程序可以将它们自己的状态值添加到 HKEY_CURRENT_USER"Software"State 和 HKEY_LOCAL_MACHINE"Software"State 中。
如果本机开发人员希望检索通知,则他们具有多个选择,包括 Windows 消息、回调函数和消息队列。那些希望创建通知提供程序的开发人员可以在某个适当的注册表位置下面创建一个项,并且使用RegistrySetDWORD或RegistrySetString函数来创建和修改该项下面的值。表 5 列出常用的本机 State and Notification Broker 函数。
表 5. 常用 State and Notification Broker API 本机函数 | |
函数 | 说明 |
RegistryNotifyApp | 通过将 Windows 消息发送到应用程序窗口,将指定状态值的更改通知给应用程序。如果该应用程序尚未运行,则 State and Notification Broker API 会启动它。 |
RegistryNotifyWindow | 通过将 Windows 消息发送到应用程序窗口,将指定状态值的更改通知给应用程序。 |
RegistryNotifyMsgQueue | 通过向命名的消息队列发送通知,将指定状态值的更改通知给应用程序。 |
RegistryNotifyCallback | 通过调用传递的回调函数,将指定状态值的更改通知给应用程序。 |
RegistryGetDWORD / RegistryGetString | 检索当前状态值。 |
RegistrySetDWORD / RegistrySetString | 由 State and Notification Broker API 提供程序用来创建和修改状态值。 |
RegistryTestExchangeDWORD | 由 State and Notification Broker API 提供程序用来有条件地修改状态值,并且将测试和更新作为单个原子操作予以执行。 |
托管开发人员通过使用属于“Microsoft.WindowsMobile.Status”命名空间和同名程序集的类与 State and Notification Broker 交互。标准委托机制用于向托管类发送状态更改通知。表 6 显示常用托管类的列表。
表 6. 常用 State and Notification Broker API 托管类 | |
函数 | 说明 |
RegistryState | 封装被监视的状态值,包括检索值、监视该值的更改以及在该值更改时根据情况启动应用程序。 |
SystemState | 提供公共系统状态值之上的抽象,并且通过属性提供对这些值的访问。 |
code :
C++
hr = RegistryNotifyWindow(
HKEY_LOCAL_MACHINE,
c_wszHardwareStatStore,
c_wszCradled,
g_hCurWndDialog,
WM_CHANGE_CRDL_REG,
IDC_CRADLED,
&nc,
&g_CrdlReg
);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
...
// Handle the Cradling Status Change Message
case WM_CHANGE_CRDL_REG:
ShowCradleStatus(wParam);
break;
// Handle the Sync Status Change Message
case WM_CHANGE_SYNC_REG:
ShowSyncStatus(wParam);
break;
...
}
C#
using Microsoft.WindowsMobile.Status;
SystemState s = new SystemState(SystemProperty.CradlePresent);
s.Changed +=
new ChangeEventHandler(ChangeOccurred);
public void ChangeOccurred(object sender, ChangeEventArgs args)
{
SystemState state = (SystemState)sender;
txtChanges.Text += state.Property.ToString() +
" = " + ConvertToString(args.NewValue) + "/r/n";
}