在Smartphone/Pocket PC 2003上设置提醒

类别:编程语言 点击:0 评论:0 推荐:

转贴自http://blog.joycode.com/musicland/articles/34511.aspx
在用.NET CF开发Smartphone/Pocket PC应用时,我们经常需要给应用程序增加提醒功能,比如在下午两点时提醒用户去开会,或者在手持设备和PC通过ActiveSync连接时提醒用户同步某项重要数据。目前,实现提醒功能主要有以下几种方式:

 

Windows CE .NET提供了CeSetUserNotification(在CE 2.11版本及以后又增加了CeSetUserNotificationEx)这一API,可用于创建或修改提醒。该方法适用于Smartphone和Pocket PC。 Windows CE .NET还提供了另外一条API,SHNotificationAdd,也可以完成提醒的工作。该提醒是以Pocket PC中的气泡方式显示的,在Smartphone上不予处理。 Windows CE .NET中内置了Pocket Outlook,并提供了POOM (Pocket Outlook Object Model)以便二次开发。该方法适用于Smartphone和Pocket PC。

 

以上三种方法在开发时,均不同程度地要用到平台调用 (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增加约会

 

本文地址:http://com.8s8s.com/it/it23712.htm