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

上一期我们实现了将联系人信息备份到指定文件里的功能。这次,我们将要实现备份短信息的功能,同时,还要实现清空联系人和清空短信息的功能。

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)。

03hhtswc01

在弹出的“添加引用”对话框中,选择“浏览”标签页,选中我们刚才拷贝到项目目录下的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),

03hhtswc02

分别为三个按钮分别创建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)。

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

03hhtswc04

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

网间谣传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期)

原文地址:https://www.cnblogs.com/tanjian/p/1680599.html