“实践出真知”,也许你只有真正完成一个“项目”时,才能体会到原来Windows Mobile(以下简称WM)编程原来——不过如此!
在接下来的几期里面,我们将动手,制作一个山寨机非常热门的功能——“手机个人信息保险箱”程序。什么手机丢了不用怕,发个短信联系人、短信就会取回来等等功能。
你制作好的程序可以实现如下目标:
①本地备份:将联系人、短信信息备份到文件
②通过发短信指令,把备份的联系人、短信以邮件形式发送及取回。
③通过短信发送指令后,将手机上指定的联系人、短信和指定文件夹内容清空。
本期我们首先实现将联系人信息备份到文件的功能。
一、你以后会用到的知识
在正式开发前,先要熟悉一下程序中用到的知识。
1.个人信息管理
访问WM内的联系人,就要用到PPOM(Pocket Outlook Object Model ),它是基于微软COM技术的一套针对手机上(PIM)个人信息管理的COM接口库。也就是说要对包括联系人、任务、约会提醒等信息在内的资料操作时,都要用到它。
伴随着WM 5的发布,新的.Net CF类库中,增加了PocketOutlook(相当于手机上的Outlook功能)相关的功能。利用它们,可以很方便的完成以前必须借助本地函数才能实现的功能。为了访问联系人信息,我们可以使用命名空间Microsoft.WindowsMobile.PocketOutlook下面提供的类和方法读取该联系人的各种信息,例如姓名,电话,地址,类别等。
这样我们利用POOM,可以随意控制PPC和SP上的E-mail、短信、联系人、约会、任务,可以开发电话簿管理程序,可以开发短信管理程序,可以开发电话簿、短信息备份程序,个人事务管理程序等。
小知识
所谓的“命名空间”概念
如果小明A公司的员工,工号为0011,而小张是B公司的员工,工号也是0011,由于两个人不在同一公司,所以使用相同的工号不会出现问题,这里的每个公司就表示一个独立的“命名空间”。在大型的程序中,很可能会出现数百或更多的类、变量或是方法(函数),通过“命名空间”,可以很容易避免重名引起的一系列问题。
2.设备对话框
打开VS2008左侧的“工具箱”浮动框,我们可以看见设备对话框内,有OpenFileDialog和SaveFileDialog两个组件(见图1),
它们用于向用户显示对话框,提示用户选择文件,前者选择的是需要打开的文件,后者选择的是需要保存到的文件名。
我们可以通过类似下面的代码使用“设备对话框”来获取文件名:
if (DialogResult.OK == saveFileDialog1.ShowDialog())//用户确认选择了一个文件
{
string fileName = saveFileDialog1.FileName;//获取用户所选择的文件名
3.文件操作
如果需要对文件操作,则我们需要命名空间System.IO的帮助,它提供了文件的读写,文件夹的控制功能。
其中System.IO.File类,提供了用于创建、复制、删除、移动和打开文件的静态方法,结合System.IO.StreamReader与System.IO.StreamWriter类,便可以实现字节文件的读写了。
你可以在http://work.newhua.com/cfan/201002/02wmcx01.txt看到如何实现打开一个文件并往文件内写入一行文本的方法。
二、Let's go!现在就开始创建项目吧!
现在我们就要开始创建项目了,照例你可以从http://work.newhua.com/cfan/201002/StrongBox.rar下载到下面提到的程序。
1.创建项目
启动VS2008,选择“文件→新建项目”。在弹出的“新建项目”的“项目类型”中选择“Visual C#→智能设备”,“模板”选“智能设备项目”,“名称”设为“StrongBox”。在弹出的“添加新智能设备项目”对话框中,“目标平台”选择“Windows Mobile 6 Professional SDK”,“.Net Compact Framework 版本”选择“.Net Compact Framework Version 3.5”,“模板”选“设备应用程序”完成项目创建。
2.设计界面
双击“解决方案资源管理器”中的Form1.cs,打开界面设计器,从右侧的工具栏中,拖入一个Button控件和一个SaveFileDialog组件,将Button1控件的Name属性修改为buttonContactBak,Text属性修改为备份联系人。并修改saveFileDialog1的相关属性(见图2)。
3.添加引用
上文提到,我们需要使用Microsoft.WindowsMobile.PocketOutlook命名空间的一些对象,读取该联系人的各种信息。而该命名空间所在的程序集,并没有默认被引用,我们需要手动添加程序集Microsoft.WindowsMobile.PocketOutlook.dll的引用。
在“解决方案资源管理器”内,点击 “StrongBox→添加引用→.Net”,选中 Microsoft.WindowsMobile.PocketOutlook,点击“确定”即可(见图3)。
打开Form1.cs,添加如下代码:
using Microsoft.WindowsMobile.PocketOutlook;
4.添加事件响应
首先打开Form1.cs,添加如下代码:
/// <summary>
/// 将通讯簿备份到指定文件
/// </summary>
/// <param name="fileName">文件名</param>
void ContactBackup(string fileName)
{
try
{
File.Delete(fileName);//删除文件
}
catch
{
}
using (OutlookSession s = new OutlookSession())//创建OutlookSession实例
{
using (StreamWriter sw = File.AppendText(fileName))//打开文件
{
foreach (Contact c in s.Contacts.Items)//轮询通讯簿
{
sw.WriteLine("{0}:{1}", c.FileAs, c.MobileTelephoneNumber);//将姓名,手机号存入附件文件。这里仅保存姓名,手机号。更多内容可自行添加
}
sw.Flush();
sw.Close();
}
}
}
然后双击界面设计器中的buttonContactBak,将自动生成该按钮的点击事件响应,我们修改代码如下:
private void buttonContactBak_Click(object sender, EventArgs e)
{
if (DialogResult.OK == saveFileDialog1.ShowDialog())//用户确认选择了一个文件
{
string fileName = saveFileDialog1.FileName;//获取用户所选择的文件名
ContactBackup(saveFileDialog1.FileName);//将通讯簿备份到指定文件
MessageBox.Show("OK!");//通知用户,成功执行
}
}
5.调试程序
在VS2008中点击菜单“调试→启动调试”(或者直接按F5),在弹出的部署对话框中选择Windows Mobile 6 Professional Emulator,点击“部署”,可以在模拟器中看到运行效果了(见图4)。
特评:WM被搞砸了!
当2009年9月24日,微软CEO史蒂夫鲍尔默在创业投资峰会上承认公司搞砸了WM,同时表示WM 7已经启动的时候,不知道有多少人失望,当然,也有不少“死忠”本着“死猪不怕开水烫”的精神,打死都不承认WM系统有问题,誓死捍卫着WM。不过残酷的现实告诉了我们——WM在美国的份额是在下降的。
据微软英国部门负责人说WM 7会在2010年年底发布,而通过Android和iPhone的前车之鉴,如果手机系统的成功除了有强大的硬件平台外,更主要的是需要大量第三方软件程序来支持的,发布时间这么晚,能否再创辉煌还真难说。
其实,这一现象在微软自家的Windows中也有体现,微软一直在大力扶持PC软件厂商,为他们提供各种帮助,目的就是希望他们更方便的开发出好用、实用的Windows程序,巩固Windows的平台。
只是,2010年底,天知道Android、iPhone到时候已经强大到什么程度了……
(载《电脑爱好者》2010年第2期)