完美达成:个人信息保险箱

这一期的内容,是我们的“个人信息保险箱”开发部分的最后一篇了。今天,我们将要实现通过短信远程控制手机,清空、取回你的通讯簿。

04hhtswctt

  我们的“个人信息保险箱”终于开发完成,期待你在后面的学习中完善它。

1.实现发条短信遥控手机
要通过发一条短信就能控制手机,有一个难点,那就是手机接收到的短信这么多,怎么知道哪条就是指令短信呢?这就需要手机能自动识别指令短信。要自动识别指令短信,必须要进行短信拦截,进行逐一识别。
我们可以使用.Net CF中提供的MessageInterceptor来进行短信拦截。从.Net CF 2.0开始,就提供了Microsoft.WindowsMobile.PocketOutlook.MessageInterception命名空间,通过使用该命名空间,可以根据指定的条件截获短信和邮件的到达消息。
该命名空间中我们要用到3个类:
①MessageInterceptor:短信息拦截器类,一旦添加监控事件后,就会对所有短消息进行监控。
②MessageCondition:监控的过滤筛选条件类,通过设置需要过滤某个字段。
③MessageInterceptorEventHandler:监控事件处理器,一旦截获某消息,就立即执行该方法。
我们需要创建一个短信息拦截器,同时要创建一个过滤条件,该过滤条件规定以什么样的方式对接收到的短信进行选择性匹配,将该过滤条件赋值给短信息拦截器之后,再为该拦截器添加监控事。这样,短信拦截器便可以按拦截到我们所需要拦截的短信了。
学会配置短信息拦截器,对开发短信类软件或者系统软件是有很大帮助的,例如开发短信防火墙、远程遥控程序等。此外,还可以利用短信指令进行一些恶作剧程序的开发。

2.偷偷将短信内容发到邮箱中
在拦截到遥控指令之后,我们就需要执行将信息打包发送到指定邮箱的操作。
要通过邮件远程取回信息,必须先将手机中的重要信息添加到邮件中。如何将信息内容添加到邮件中发送呢?在命名空间Microsoft.WindowsMobile.PocketOutlook中,提供了类EmailMessage,即电子邮件类。它里面几个主要的属性和方法:
EmailMessage.To:接受者列表
EmailMessage.Subject:邮件主题
EmailMessage.BodyText:邮件内容
EmailMessage.Attachments:邮件附件列表
创建一个EmailMessage实例,通过这些属性设定邮件主题、内容,添加接受者、添加邮件附件,然后通过EmailMessage.Send或者OutlookSession里面提供的Send方法发送即可。这种方法,在邮件群发、邮件通知等功能时都可以用到。

3.开工啦!
本文中的程序可以从http://work.newhua.com/cfan/201004/StrongBox.zip下载到。
第一步:打开上次的项目,添加引用。
双击StrongBox.sln,打开上次创建的项目。右击StrongBox项目下的“引用”,在弹出菜单中,点击“添加引用”在弹出的“添加引用”对话框中,选择“.NET”标签页,选中“Microsoft.WindowsMobile”,点击“确定”即可。
打开Form1.cs,添加命名空间引用:

using Microsoft.WindowsMobile.PocketOutlook.MessageInterception;


第二步:添加创建拦截器的方法
在Form1.cs内,添加方法CreateMessageInterceptor,该方法用于创建一个短消息拦截器:

        /// <summary>
        /// 创建一个短消息拦截器
        /// </summary>
        /// <param name="ComparisonValue">拦截器所匹配的内容</param>
        /// <param name="EventHandler">拦截到消息时候的处理方法</param>
        void CreateMessageInterceptor(string ComparisonValue, MessageInterceptorEventHandler EventHandler)
        {
            MessageCondition messageCondition = new MessageCondition();             //创建一个拦截条件对象
            messageCondition.Property = MessageProperty.Body;                       //针对消息体匹配
            messageCondition.ComparisonType = MessagePropertyComparisonType.Equal;  //匹配类型为全部相等
            messageCondition.ComparisonValue = ComparisonValue;                     //匹配的内容
            messageCondition.CaseSensitive = true;                                  //匹配时区分大小写 

            MessageInterceptor messageInterceptor = new MessageInterceptor(         //创建一个短消息拦截器对象
                InterceptionAction.NotifyAndDelete,                                 //拦截动作:通知并删除
                true);
            messageInterceptor.MessageCondition = messageCondition;                 //拦截条件赋值给拦截器
            messageInterceptor.MessageReceived += EventHandler;                     //事件处理方法
        }

第三步:添加通讯簿备份指令处理方法
在Form1.cs内,添加方法messageInterceptor_ContactBak_Handler,在程序拦截到“通讯簿备份指令”的时候,将调用该方法进行处理。

        /// <summary>
        /// 通讯簿备份指令处理方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void messageInterceptor_ContactBak_Handler(object sender, MessageInterceptorEventArgs e)
        {
            string attachmentFileName = @"\My Documents\af.txt";        //附件文件路径
            EmailMessage email = new EmailMessage();                    //创建Email实例
            email.Subject = "{StrongBox:ContactBak}";                   //设定邮件主题
            Recipient recipient = new Recipient("******@*****.com");  //创建一个接受者实例,可以修改为你自己的邮箱
            email.To.Add(recipient);                                    //添加该接受者
            ContactBackup(attachmentFileName);                          //将通讯簿备份到指定文件
            Attachment attachment = new Attachment(attachmentFileName); //将该备份文件创建为一个附件实例
            email.Attachments.Add(attachment);                          //添加该附件 

            using (OutlookSession s = new OutlookSession())
            {
                s.EmailAccounts[0].Send(email);                         //用第一个邮件账户发送该邮件
            } 

            SmsMessage sms = new SmsMessage(e.Message.From.Address, "ContactBak:Executed");
            sms.Send();                                                 //回复信息,告知指令已成功执行
        }

第四步:添加清空通讯簿指令处理方法
在Form1.cs内,添加方法messageInterceptor_ContactClear_Handler,在程序拦截到“清空通讯簿指令”的时候,将调用该方法进行处理。

        /// <summary>
        /// 清空通讯簿指令处理方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void messageInterceptor_ContactClear_Handler(object sender, MessageInterceptorEventArgs e)
        {
            ContactClear();//清空通讯簿 

            SmsMessage sms = new SmsMessage(e.Message.From.Address, "ContactClear:Executed");
            sms.Send();//回复信息,告知指令已成功执行
        }

第五步:创建拦截器
在方法Form1()中,添加代码,创建两个拦截器,并注册对应的处理方法:

            CreateMessageInterceptor("{StrongBox:ContactBak}",
                new MessageInterceptorEventHandler(messageInterceptor_ContactBak_Handler));
            CreateMessageInterceptor("{StrongBox:ContactClear}",
                new MessageInterceptorEventHandler(messageInterceptor_ContactClear_Handler)); 

第六步:调试
在VS2008中点击菜单“调试→启动调试”(或者直接按F5),在弹出的部署对话框中选择Windows Mobile 6 Professional Device(见图1)(图1  在手机上运行程序),点击“部署”,稍候就可以在手机中看到程序运行了。
我们使用其他手机朝你的测试手机发送指令短信“{StrongBox:ContactBak}”或者“{StrongBox:ContactClear}”,然后就会看到程序的运行效果了(见图2)

04hhtswc02

(图2  清空联系人)。
真机调试清空联系人之前,千万别忘记备份好你的通讯簿(见图3)

04hhtswc03

(图3  备份好的通讯簿)。

到这里,我们程序的开发工作就全部完成了。虽然程序看起来也像模像样了,其实离实用的要求还相差甚远。比如说,程序中我们没有考虑各种异常情况,界面的设计也不够人性化,拦截器的部分应该一直后台运行的等等。还有很多可以完善的地方。大家可以在理解现有代码的基础上,再继续完善。可能你已经注意到了,这次我们调试程序介绍的是使用真机进行调试的情况。在最后一期中我们将专门介绍如果通过蜂窝模拟器配合设备仿真器进行调试的方法。

Windows Mobile又“杯具”了!
据国外某媒体报道Windows Mobile(WM)最近的日子很不好过,LG宣布将使用Android平台来强化智能手机业务,要知道一年前LG还表示以WM旗下智能手机主要操作系统,而且其他如索爱、Moto等厂商也都转移到了Android平台。更甚者已经有谣传WM 7.0将会在2011年推出(但某人报料称今年9月就能看到使用WM 7系统的手机)。
于是该报建议:微软要像谷歌那样免费给厂商提供Windows Mobile,或者放弃Windows Mobile,或是从企业入手,打开新局面。
其实不管怎么讲,微软在智能手要市场落后的越来越远,当务之急就是要改变老旧的定位,记得WM系统刚刚推出时最大的卖点就是Windows用户可以平滑过渡,不过现在这反到成了拖累。复杂的操作,让人搞不懂的设置,死机、速度慢等问题频出,系统版本开发周期长,除了补丁问题外,大部分Windows的毛病WM到是都有了。
WM茶几了……

(载《电脑爱好者》2010年第4期)

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