抛砖引玉 —— 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就根本搜索不到,所以大家有什么问题也不妨提出,让我们一起交流交流。呵呵。

      

发表评论
   回复   引用   查看     
#1楼 [ 楼主] 2008-08-30 00:12 | U2U       
这是从我的整个程序中抽取出来的一段代码,所以有些地方大家可以根据自己的实际情况进行修改。
   回复   引用   查看     
#2楼 2008-08-30 08:48 | Wuya       
MSDN中文CAST里面有两篇专门写短信编程的文章,或许对您有用。
   回复   引用   查看     
#3楼 [ 楼主] 2008-08-30 09:52 | U2U       
@Wuya
谢谢,但是那个文章似乎现在进不去了
   回复   引用   查看     
#4楼 2008-08-30 18:49 | xjb       
   回复   引用   查看     
#5楼 [ 楼主] 2008-08-30 23:53 | U2U       
@xjb
谢谢,只可惜这个也是拦截接收到的短信,而不能拦截自己发送出去的短信啊。。 T_T
   回复   引用   查看     
#6楼 2008-08-31 10:50 | 簡簡單單..       
Mark
   回复   引用   查看     
#7楼 [ 楼主] 2008-08-31 17:19 | U2U       
看来cnblogs没几个人做WM的?.....失望
   回复   引用     
#8楼 2008-09-03 16:57 | faquir[未注册用户]
或许可以考虑使用AdviseSink,监视发件箱的状态!
   回复   引用   查看     
#9楼 [ 楼主] 2008-09-03 20:20 | U2U       
@faquir
我这样做,可是不成功。虽然能监视到准备发送的短信,可是即便delete了这条短信,依然会被发送出去。
   回复   引用   查看     
#10楼 [ 楼主] 2008-09-03 20:52 | U2U       
哈哈,解决了!修改注册表,把自带的号码分析弄坏了就可以不让他发送出去了。。。
   回复   引用     
#11楼 2008-09-08 14:05 | beyondma[未注册用户]
请问下楼主,如果我接到的短信之后,想屏蔽系统弹出通知(而不是将其删掉),应该如何做?
   回复   引用   查看     
#12楼 [ 楼主] 2008-09-08 18:03 | U2U       
@beyondma
如果你用.net cf的话,用MessageInterceptor(好像是这样拼吧,我手机回复的),设置Action为NotifyAndDelete,然后自己把信息写进收件箱——这是我当前想到的办法。估计还有更好的办法,好比可以通过修改注册表之类的,可是我一直没找到。如果你找到的话也不妨告诉我一下,谢谢。
   回复   引用     
#13楼 2009-01-06 16:44 | quicksoftxyz[未注册用户]
--引用--------------------------------------------------
U2U: 哈哈,解决了!修改注册表,把自带的号码分析弄坏了就可以不让他发送出去了。。。
--------------------------------------------------------


楼主,我想知道,你是怎么弄坏的呀,要改动什么地方,谢谢。
   回复   引用   查看     
#14楼 [ 楼主] 2009-01-06 17:54 | U2U       
@quicksoftxyz
我最近在考试,代码不在这台电脑上。你去看Windows Mobile 6.0 SDK帮助文档,里面有。
   回复   引用   查看     
#15楼 2009-03-30 20:31 | 浩@子       
把完整的代码开源一下算了
   回复   引用     
#16楼 2009-05-20 19:05 | liaoxh[未注册用户]
我现在可以拦截到短信了,但是往inbox里面写短信就一直不成功,能给我个示例代码不
   回复   引用   查看     
#17楼 [ 楼主] 2009-06-03 17:12 | U2U       
@liaoxh
我在正文中的代码不就有写inbox的代码了么 =_=|| ~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值