二 MessageInterceptor
对于C#来说,可以很方便的拦截短信,而不用C++的那些api,倒是很省心,但我只是试验了一下拦截短信,可以拦截,后续操作还不知道是否方便。
1. 添加必要的引用:
using Microsoft.WindowsMobile.PocketOutlook;
using Microsoft.WindowsMobile.PocketOutlook.MessageInterception;
此时可能还是不能编译通过,看一下解决方案下的引用是否有Microsoft.WindowsMobile.PocketOutlook和Microsoft.WindowsMobile和Microsoft.WindowsMobile.PocketOutlook.MessageInterception,这些如果没有手工添加引用,网上查的是只需要using就可以,不过我试的不行,手工添加引用后才可以的。
2. 添加代码
MessageInterceptor m_interceptor;
m_interceptor = new MessageInterceptor();
m_interceptor.MessageReceived += new MessageInterceptorEventHandler(m_onMessageReceived);
// 这里对interceptor的MessageReceived添加一个handler,这个是个典型的observer模式,当观察者发现新短信的时候调用注册的handler。
void m_onMessageReceived(object sender, MessageInterceptorEventArgs e)
{
//这个函数就是handler函数。当短信到达时就会被调用,这些函数也是我从网上找到的,写成了两个函数,简单的只需要一个函数就可以了。
if(e.Message is SmsMessage)
m_receiveSms(e.Message as SmsMessage);
}
private void m_receiveSms(SmsMessage smsMessage)
{
// m_sbMessages是一个StringBuilder,textBox1是一个TextBox,我用StringBuilder组合短信的各个字段,然后在TextBox中显示
// From
m_sbMessages.Append("From:/r/n");
m_sbMessages.Append(String.Format("/tName: {0}/r/n", smsMessage.From.Name));
m_sbMessages.Append(String.Format("/tAddress: {0}/r/n", smsMessage.From.Address));
// Received
m_sbMessages.Append("Received:/r/n");
m_sbMessages.Append(String.Format("/t{0}/r/n", smsMessage.Received.ToString()));
// Sent
m_sbMessages.Append("Sent:/r/n");
m_sbMessages.Append(String.Format("/t{0}/r/n", smsMessage.LastModified.ToString()));
// Body
m_sbMessages.Append("Message:/r/n");
m_sbMessages.Append(String.Format("/t{0}/r/n", smsMessage.Body));
// refresh
textBox1.Text = m_sbMessages.ToString();
textBox1.Update();
// add a new line
m_sbMessages.Append("/r/n");
smsMessage.Read = true;
}
这个方法拦截短信,我还有3个问题,1.还不知道如何不让系统提示新短信,2.设置了信息为已读,却还是显示为未读,3.如何移动短信到其他文件夹还不知道
这个方法还有一个过滤的类我还没有试,大概就是设置过滤的是发信人还是内容等等,然后根据规则拦截短信,而不是所有的都拦截。