在.net 2.0中,MS就提供了Microsoft.WindowsMobile.PocketOutlook.MessageInterception命名空间,通过使用该命名空间,可以截获短信和邮件的到达消息。
该命名空间中的一些类及属性:
1.MessageInterceptor:监控对象类,一旦添加监控事件后,就会对所有消息进行监控。
2.MessageCondition:监控的过滤筛选条件类,通过设置需要过滤某个字段。
3.MessageInterceptorEventHandler:监控事件,一旦截获某消息,就立即执行该方法。
4.InterceptionAction(枚举):
Notify(提示,但此时系统仍会第一时间处理,自定义处理虽然有效,但肯定不是大家想要的。)
NotifyAndDelete(系统不会做任何处理,直接交给用户自己处理,同时达到的消息,如果用户不处理,则会删除。)
5.MessageProperty(枚举):按照某个属性进行对比
6.MessagePropertyComparisonType(枚举):对比方法

运行程序效果如下:

MOBILE开发中的短信拦截

在Menu菜单下,点击Message Intercepter事件,开始监听。在此,我设置了,当发短消息的用户为Test Man时,将短消息过滤,不会在短消息的收件箱中出现,截获的内容这会在界面上显示。

测试:运行Cellular Emulator程序,输入电话号码及短信内容,发送到模拟器上。

 

MOBILE开发中的短信拦截

模拟器效果如下:

MOBILE开发中的短信拦截

可以看到消息已经被截获了,且消息内容一致。

MOBILE开发中的短信拦截

如果发送号码为123456788,则不是添加的联系人(Test Man)。则不会截获。

MOBILE开发中的短信拦截

 

代码如下:

 

 1MOBILE开发中的短信拦截        private void menuItem4_Click(object sender, EventArgs e)
 2        }

 


Tips:
1.使用MessageInterceptor能监视的只是一个属性,如果根据不同用户,指定不同过滤操作的话,就无法实现。
2.一旦将InterceptionAction设为NotifyAndDelete,则系统就不做处理了,接收到的消息,就不会在收件箱中出现,需要自己添加进去(下文会介绍如何实现)
3.可以不设置MessageInterceptorMessageCondition,这样使得所有消息都截获,然后自己处理,这时,就可以设置更广泛的过滤。

一旦将消息全部截获后,必不可少的会遇到一些不需要过滤的消息,此时,还要将消息重新放入收件箱中。很遗憾,暂时在托管环境中没有相应的操作类,相信MS会在以后的CF版本中会对此进行扩展的。

下面将介绍如何SIM卡的短消息的API。
涉及的API:
SimInitialize方法:初始化SIM卡的对象指针。
SimDeinitialize方法:释放SIM卡指针,类似于Ado里的连接对象,操作完后,关闭对象。
SimGetSmsStorageStatus方法:得到
SIM卡里的可以存放的最大消息个数及已存放的消息个数。
SimReadMessage方法:从SIM卡中读取短信(如果SIM卡有短信)。
SimWriteMessage方法:向SIM卡中写入或修改短信。
SimDeleteMessage方法:删除SIM卡中某条短信。
涉及的结构体:
SimMessageTag:定义某条消息中的所有信息。
SystemTime:自定义的一个时间结构体。

在运行的程序中点击Test事件,则会读取SIM卡中所有短信,并且向SIM卡中添加一条短信。

MOBILE开发中的短信拦截
运行该事件前,短信收件箱。
MOBILE开发中的短信拦截
运行结果,读取SIM卡中的短信内容(只有1条)。
MOBILE开发中的短信拦截
查看短信收件箱,该短信已写入。

通过这些API,我们可以很方便的将自己需要的短信写入SIM,而在过滤事件中过滤不需要的。

 

代码如下:

  1MOBILE开发中的短信拦截        [DllImport("cellcore.dll", SetLastError=true)]
  2MOBILE开发中的短信拦截        private static extern int SimInitialize(int dwFlags, int lpfnCallBack, int dwParam, out int lphSim);
  3MOBILE开发中的短信拦截
  4MOBILE开发中的短信拦截        [DllImport("cellcore.dll", SetLastError = true)]
  5MOBILE开发中的短信拦截        private static extern int SimDeinitialize(int hSim);
  6MOBILE开发中的短信拦截
  7MOBILE开发中的短信拦截        [DllImport("cellcore.dll", SetLastError = true)]
  8MOBILE开发中的短信拦截        public static extern int SimGetSmsStorageStatus(int hSim, int dwStorage, ref int lpdwUsed, ref int lpdwTotal);
  9MOBILE开发中的短信拦截
 10MOBILE开发中的短信拦截        [DllImport("cellcore.dll", SetLastError = true)]
 11MOBILE开发中的短信拦截        private static extern int SimWriteMessage(int hSim, int dwStorage, ref int lpdwIndex, ref SimMessageTag SmsStructType);
 12MOBILE开发中的短信拦截
 13MOBILE开发中的短信拦截        [DllImport("cellcore.dll", SetLastError = true)]
 14MOBILE开发中的短信拦截        private static extern int SimReadMessage(int hSim, int dwStorage, int lpdwIndex, ref SimMessageTag SmsStructType);
 15MOBILE开发中的短信拦截
 16MOBILE开发中的短信拦截        [DllImport("cellcore.dll", SetLastError = true)]
 17MOBILE开发中的短信拦截        private static extern int SimDeleteMessage(int hSim, int dwStorage, ref int lpdwIndex);
 18MOBILE开发中的短信拦截
 19MOBILE开发中的短信拦截        private void menuItem6_Click(object sender, EventArgs e)
 20        }

 

DllImport中定义SetLastError,这样在调用API出错时,可以通过Marshal.GetLastWin32Error()来取得ErrorCode。
SimInitialize方法的第一个参数,网上很多直接写0,为什么是0,因为常量SIM_INIT_NONE定义为0。
在操作SIM卡消息时的所有方法都需要dwStorage参数,该参数常量定义为:
SIM_NUMSMSSTORAGES = 2,从SIM卡里读取
SIM_SMSSTORAGE_BROADCAST = 1,从设备本地读取
添加一条消息时,该消息结构体的赋值中
dwAddressType = 1 (SIM_ADDRTYPE_INTERNATIONAL)
dwNumPlan = 1 (SIM_NUMPLAN_TELEPHONE)
dwParams = 111 必须设为111,否则添加不了,该数字是属性累加起来的
cbHdrLength = 0 (短信头的长度通常为0)

 

 1MOBILE开发中的短信拦截[StructLayout(LayoutKind.Sequential)]
 2MOBILE开发中的短信拦截public struct SystemTime
 3}

 

字段长度设置,根据参考该dll的头文件定义的,为256

Tips:
1.在调查dll的某些API的过程确实很复杂,需要不断尝试,这里推荐大家,一旦调用出错,可以通过Marshal.GetLastWin32Error()来取得ErrorCode,这样可以知道错误类型。在调用API时,尽量多参考其头文件,这样可以很方便了解这些方法中的一些结构体及一些常量。
2.如果运行模拟器的话,向SIM卡里添加短信后,在短信收件箱中不会显示出来,但实际是添加进去了。必须通过关闭电话,然后重新设置电话网络,这样SIM卡会重新加载。实际的设备应该不会这样。


相关文章:

  • 2022-12-23
  • 2021-10-10
  • 2021-12-06
  • 2021-08-24
  • 2022-12-23
  • 2021-08-19
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-06-28
  • 2022-12-23
  • 2022-12-23
  • 2022-03-02
  • 2022-12-23
相关资源
相似解决方案