抛砖引玉 —— Windows Mobile 下的短信开发

      先闲聊几句,说说这文章和文章里的代码是为何而产生的。小弟今年9月6日就要正式开始我的大学生活。我也算上是个短信达人,上大学的话短信费估计就更疯狂了,所以就考虑用包月的GPRS发送短信。虽然网络上已经有不少这类的软件,如飞信和做做客吧。然而这些软件都存在不太符合我个人期望的问题,比如信息记录在不同的地方以后翻查管理不方便;而做做客这类非通信营运商提供的软件,信息安全没保障,一会儿没准闹出个“艳信门”(当然,我也没那个艳福~),那我岂不是完蛋了。
 
      自己手上用的是Windows Mobile 6.1的机子,所以就想写一个自用版的软件够无缝地结合到原有的SMS服务和客户端窗体中,就是说:当我在WM原有的短信界面进行发送操作时,程序能自动拦截这条短信,不让他发送出去,然后转由GPRS发送出去。同时还需要把接收到的短信更换格式以后保存下来。对于我而言这里存在2个技术难点:一就是如何将信息写入收件箱和已发邮件箱,使短信看起来跟通过系统发送后的情况一样;二就是如何拦截准备发送的短信。
 
      对于写入短信到收件箱或者已发邮件箱,CSDN的无聊客采取的办法是对Sim卡进行直写操作(他的方法似乎只能写入收件箱),我个人不太喜欢这种方式。这样看起来跟默认情况下收发的短信是不同的(其中最让人心痛的就是不能使用SMS-Chat模式),此外sim卡有一定的容量限制且不方便进行日后的统一管理。这几天查阅Windows Mobile 6.0 SDK和读取系统发送和接收的短信的各项字段,这一个问题已经较好地被我解决。
 

      但是对于如何拦截准备发送的短信,我就没办法了。网上虽然很多关于“拦截短信”这一主题的文章,然而讨论的都是拦截接收到的短信(用于过滤垃圾短信等),至今我似乎还没有看到讨论拦截准备发送的短信的文章(也许这是因为我这样的需求比较罕见吧)。我尝试通过在MAPI中注册Folder和Message类的事件,等待系统发来通知时,就把发件箱、草稿箱的短信删除 —— 可是这样并没有作用,短信还是会发送出去。

 

      所以我这个文章就叫做抛砖引玉,真的希望抛出一块砖没把大家砸死,还能引一块玉回来——找到一个能拦截准备发送出去的短信的方法。好了,废话说多了,下面放上代码,然后我提出几点大家需要注意的地方。
 

      (虽然是C++ Native的代码,不过大家把它封装一下就可以在.net里面用了)

 

核心函数代码

 

     

说明:
  1. 为了让代码显得更清晰,使大家能把注意力集中在关键的属性设置上,我把对HRESULT的判断去掉。
  2. CEMPAI对于SPropValue是比较敏感的,所以一定要调用ZeroMemory
  3. 对于收件箱内的短信,虽然读取时可以得到PR_DISPLAY_NAME这个属性,然而在CreateMessage后似乎设置该字段并不能起效果,要让发送者的姓名显示出来,可以使用一个小技巧,在PR_EMAIL_ADRESS属性值中使用FullAdress格式,即 /"姓名" <号码>/ (不包括斜杠"/")
  4. CEMAPI对于属性设置的顺序似乎也是敏感的,好比对于已发送的短信(包括需要真正发送出去的短信),都需要先设置发送目标(即Recipient),然后才能设置其他属性

 


      最后 ,希望哪位做WM开发的高手能指点一二,告诉我怎样能够拦截用户通过原始方法发送出去的短信(就是不让短信发送出去,而被程序拦截并且销毁)的方法,谢谢!Windows Mobile的SDK文档还不够丰富,起码很多东西在MSDN就根本搜索不到,所以大家有什么问题也不妨提出,让我们一起交流交流。呵呵。

      

posted @ 2008-08-29 23:59 U2U 阅读(3581) 评论(17) 编辑 收藏