您的位置:首页 > 其它

老婆,我终于会:备份短信、联系人了!

2010-03-08 10:31 330 查看
上一期我们实现了将联系人信息备份到指定文件里的功能。这次,我们将要实现备份短信息的功能,同时,还要实现清空联系人和清空短信息的功能。

1.如何管理邮件和信息?
看到这个问题,你是否会感到奇怪,我们上期不是讲到过PPOM和命名空间Microsoft.WindowsMobile.PocketOutlook吗?这个命名空间下不是提供了邮件和信息操作的功能吗?
如果你自己仔细了解过,便会发现,这个命名空间下,只提供了创建和发送邮件和信息的功能。对于信息的查看、删除等管理操作,是没有提供的。
那么我们应该怎么办呢?答案就是:使用MAPI。
MAPI(Messaging Application Progrmming Interface),如果你所在的公司使用的是Exchange邮件服务器,而你在Outlook中邮箱时,选择的是Microsoft Exchange Server,其实这时你就使用了MAPI,这种方式要比使用POP3、SMTP收发邮件的功能多得多,包括了电子邮件、计划、日程表等等。
与PPOM一样,MAPI依然是非托管的。但是更加不幸的是,.NET CF类库里面并未提供访问MAPI的方法。要在.NET CF程序中使用MAPI,我们有两种选择:自己封装或者使用第三方封装库。幸运的是,我们在CodeProject网站上发现了MAPI的.NET封装,实现了99%的.NET MAPI。作者是先用C++封装了MAPI的接口,然后再用C#进行二次包装。你可以从下面的地址找到:
http://www.codeproject.com/KB/mobile/PocketPCandSmartphone.aspx
http://msdn.microsoft.com/en-us/library/bb415647.aspx

小提示:
CodeProject网站是个好东东,上面收录了N多的不同语言的开源代码,总是能给你带来惊喜。

2.原理搞定,开工!
有了足够的支持,现在我们就开始继续工作。具体代码可以从http://work.newhua.com/cfan/201003/StrongBox.rar下载到。

第一步:打开上次的项目,添加第三方库的引用。双击StrongBox.sln,打开上次创建的项目。
复制下载到的MAPIdotnet.dll,MAPIlib.dll,OpenNETCF.dll三个MAPI所用到的库文件,右击“解决方案管理器”中的StrongBox项目,右击选择“粘贴”后,这三个文件便拷贝到项目的文件夹下面来了。右击StrongBox项目下的“引用”,在弹出菜单中,点击“添加引用”(见图1)。





在弹出的“添加引用”对话框中,选择“浏览”标签页,选中我们刚才拷贝到项目目录下的MAPIdotnet.dll即可。

第二步:添加短信息备份方法。在代码编辑器中,打开文件Form1.cs。添加如下代码:

/// <summary>
/// 将短信息备份到指定文件
/// </summary>
/// <param name="fileName">文件名</param>
void SMSBackup(string fileName)
{
try
{
File.Delete(fileName);//删除文件
}
catch
{
}
using (MAPI mapi = new MAPI())
{
IMAPIMsgStore[] messageStores = mapi.MessageStores;
foreach (IMAPIMsgStore store in messageStores)
{
IMAPIFolderID inboxid = store.ReceiveFolder;//"收件箱"文件夹ID
IMAPIFolder inbox = store.OpenFolder(inboxid);//打开收件箱。其他文件夹也可使用类似方式打开
IMAPIMessage[] messages = inbox.GetNextMessages((int)inbox.NumSubItems);
using (StreamWriter sw = File.AppendText(fileName))//打开文件
{
foreach (IMAPIMessage msg in messages)//轮询SMS
{
sw.WriteLine("{0}:{1}", msg.Sender.FullAddress, msg.Subject);//将发件人,信息内容存入文件。这里仅保存发件人,信息内容。更多内容可自行添加
}
sw.Flush();
sw.Close();
}
}
}
}

第三步:添加清空联系人、清空短信息的方法。在代码编辑器中,打开文件Form1.cs。添加如下代码:

/// <summary>
/// 清空电话簿
/// </summary>
void ContactClear()
{
using (OutlookSession outlookSession = new OutlookSession())//创建OutlookSession 实例
{
outlookSession.Contacts.Items.Clear();//清空电话簿
}
}

/// <summary>
/// 清空短信息
/// </summary>
void SMSClear()
{
using (MAPI mapi = new MAPI())
{
IMAPIMsgStore[] messageStores = mapi.MessageStores;
foreach (IMAPIMsgStore store in messageStores)
{
IMAPIFolderID inboxid = store.ReceiveFolder;//"收件箱"文件夹ID
IMAPIFolder inbox = store.OpenFolder(inboxid);//打开收件箱。其他文件夹也可使用类似方式打开
inbox.EmptyFolder();
}
}
}

第四步:添加按钮及添加事件响应。双击“解决方案资源管理器”中的Form1.cs,在窗体设计器中打开Form1。
添加“备份短信息”、“清空联系人”、“清空短信息”等三个新的按钮(见图2),





分别为三个按钮分别创建Click事件的响应,分别将代码修改如下:

private void buttonSmsBak_Click(object sender, EventArgs e)
{
if (DialogResult.OK == saveFileDialog1.ShowDialog())//用户确认选择了一个文件
{
string fileName = saveFileDialog1.FileName;//获取用户所选择的文件名
SMSBackup(saveFileDialog1.FileName);//将短信息备份到指定文件
MessageBox.Show("成功执行!", "备份短信息");//通知用户,成功执行
}
}

private void buttonContactClear_Click(object sender, EventArgs e)
{
if (DialogResult.Yes != MessageBox.Show("您确定要清空联系人吗?", "确认", MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2))
return;

ContactClear();
MessageBox.Show("成功执行!", "清空联系人");//通知用户,成功执行
}

private void buttonSmsClear_Click(object sender, EventArgs e)
{
if (DialogResult.Yes != MessageBox.Show("您确定要清空短信息吗?", "确认", MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2))
return;

SMSClear();
MessageBox.Show("成功执行!", "清空短信息");//通知用户,成功执行
}

第五步:调试程序。在VS2008中点击菜单“调试→启动调试”(或者直接按F5),在弹出的部署对话框中选择Windows Mobile 6 Professional Emulator,点击“部署”,可以在模拟器中看到运行效果了。如果你使用的是真机调试,则在部署对话框中,应该选择Windows Mobile 6 Professional Device(见图3)。




真机调试清空联系人之前,千万别忘记备份好你的通讯簿。若是提示缺少文件,则需要把MAPIdotnet.dll,MAPIlib.dll,OpenNETCF.dll三个库文件拷贝到手机的\Program Files\strongbox目录下(见图4)。





特书己见:
农村包围城市,还是城市影响城市

网间谣传Windows Mobile 7(以下简称WM)将禁止厂商自行开发WM的系统界面。
这不难让人想到iPhone和Android的策略,苹果很独很霸道,硬件苹果制造,系统也是它靠,软件还是从它的平台出来;Android则就搞出个系统,厂商去玩吧,让用户去自己搞吧!于是有了Moto的Droid,HTC的Droid Eris……
结果如何?在Android手机上,由于硬件参数、系统不同,使用的Android版本也不同,有的1.5,有的1.6,还有2.0版,导致软件有些都不能通用。谷歌更是直说——第一代Android手机G1由于内存不足无法运行未来的Android升级版本。反观iPhone,虽然新版iPhone比老版的速度快,但几乎所有固件、软件程序都能通用。
微软以前就是谷歌策略,如今难道是要转变苹果的方针了吗?
如果是真,那么你将不会再看到如索爱的XPERIA Panel,三星的TouchWiz,LG的EasyClass、Moto的MotoSurf、多普达TouchFLO和HTC Sense,
也许留下的只有山寨机中的高仿苹果了……

(载《电脑爱好者》2010年第3期)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: