在用.NET CF开发Smartphone/Pocket PC应用时,我们经常需要给应用程序增加提醒功能,比如在下午两点时提醒用户去开会,或者在手持设备和PC通过ActiveSync连接时提醒用户同步某项重要数据。目前,实现提醒功能主要有以下几种方式:
以上三种方法在开发时,均不同程度地要用到平台调用 (Platform Invoke) 或COM互操作,这对开发人员的技术要求非常高,同时也不利于提高开发速度。因此,适当的封装是非常有必要的。幸运的是,目前OpenNETCF.org (http://www.opennetcf.org) 已经完成了前两项的工作,在由OpenNETCF开发并免费发放的SDF (Smart Device Framework) 中已经把上述前两项API封装为managed API,从而极大地减少了开发人员的二次开发难度。同时,InTheHand公司 (http://www.inthehand.com) 也提供了一款非常棒的组件——Pocket Outlook,用managed code封装了底层的COM互操作,从而使开发人员从细琐的底层细节摆脱出来。不过,InTheHand这款组件只免费提供测试版,如需要在商业环境中使用还需支付费用。
下面我就通过一系列实例来说明上面几种方法的应用。
1. OpenNETCF.Win32.Notify
OpenNetCF.org在SDF中的OpenNETCF.Win32.Notify命名空间下封装了CESetUserNotification(以及相应的一套API),使用后只需要短短几行代码就能实现简单的提醒功能,如下例,可以在Smartphone/ Pocket PC 2003上设置一个1分钟后弹出的提醒对话框(需要增加对OpenNETCF.dll的引用):
UserNotification notification = new UserNotification();
notification.Action = NotificationAction.Dialog;
notification.Title = "我的提醒";
notification.Text = "别忘了锻炼!";
Notify.SetUserNotification("", DateTime.Now.AddMinutes(1), notification);
实现效果如下:
图1: Smartphone上应用OpenNETCF.Win32.Notify的效果
图2: Pocket PC上应用OpenNETCF.Win32.Notify的效果
如果想修改某项提醒,只需调用Notify.GetUserNotificationHandles返回所有当前系统存储着的提醒的句柄(handle),然后根据其中特定的句柄调用Notify.GetUserNotification就可获得相应的提醒对象,调用Notify.SetUserNotification)来修改该提醒。比如下例,就把刚才设置的提醒内容做了更改:
// 获取提醒对象 (UserNotificationInfoHeader类型)
UserNotificationInfoHeader infoHeader =? Notify.GetUserNotification(handle);
// 取出UserNotification部分并做更改
UserNotification notification = infoHeader.UserNotification;
if (notification != null)
{
notification.Text = "别忘了开会!";
Notify.SetUserNotification(handle,"", DateTime.Now.AddSeconds(18), notification);
}
2. OpenNETCF.Notification
以上方法对Smartphone 2003和Pocket PC 2003同样生效。而对于Pocket PC 2003而言,还有另外一种设置提醒的方式——弹出气泡。该方法对应的操作系统API是SHNotificationAdd,在SDF中该API被封装在OpenNETCF.Notification命名空间下。下述代码演示了这种用法(需要增加对OpenNETCF.Notification.dll的引用):
Notification notification = new Notification();
notification.Duration = 10;
notification.Flags = NotificationFlags.ForceMessage;
notification.HTML = "Hello Windows Mobile";
notification.Title = "Hi";
NotificationEngine engine = new NotificationEngine(OpenNETCF.Security.Cryptography.NativeMethods.Guid.NewGuid());
engine.Add(notification);
注意,这里是通过调用NotificationEngine.Add()方法来把一个气泡提醒增加到拖盘(tray)中。
图3: 在Pocket PC上应用NotificationEngine.Add的效果
同样,我们可以通过调用NotificationEngine.Remove来删除某项提醒,NotificationEngine.Update来更新提醒,NotificationEngine.GetData方法来获取提醒内容。它们所封装的系统API分别是SHNotificationRemove、SHNotificationUpdate和SHNotificationGetData。
3. InTheHand.PocketOutlook
通过InTheHand封装好的PocketOutlook dll,我们可以非常方便地利用Pocket Outlook所提供的强大功能。比如下面的例子演示如何通过几行代码来在本机的Pocket Outlook中增加一项约会,你可以利用类似的方法来增加联系人、日程信息等等(需要增加对InTheHand.Interop.dll和InTheHand.PocketOutlook.dll的引用):
using (OutlookApplication oApp = new OutlookApplication())
{
using (Appointment oAptmt = oApp.CreateAppointment())
{
oAptmt.Subject = "提醒";
oAptmt.Body = "别忘了锻炼!";
oAptmt.Start = DateTime.Now.AddHours(1);
oAptmt.BusyStatus = BusyStatus.OutOfOffice;
oAptmt.Save();
}
}
实现效果如下:
图4: 在Smartphone上应用Pocket Outlook增加约会
图5: 在Pocket PC上应用Pocket Outlook增加约会