wm下拦截指定内容或电话号码的短信
来源:互联网 发布:淘宝自定义全屏 编辑:程序博客网 时间:2024/05/16 17:59
看了些关于拦截短信的帖子,下面说说我的理解,不对之处请指正。
在下面链接的帖子中提到了有3种方法去注册Mailrule.dll。我觉得还是在程序中去注册比较好。我是这样做的:
第一步: 编辑好sdk中的Mailrule的程序,生成dll文件。其中我们关心的主要就是ProcessMessage函数中的内容
SizedSPropTagArray(1, sptaSubject) = { 1, PR_SUBJECT};
SizedSPropTagArray(1, sptaEmail) = { 1, PR_SENDER_EMAIL_ADDRESS};
hr = pMsg->GetProps((SPropTagArray *) &sptaSubject, MAPI_UNICODE, &cValues, &pspvSubject);
hr = pMsg->GetProps((SPropTagArray *) &sptaEmail, MAPI_UNICODE, &cValues, &pspvEmail);
其中pspvSubject得到短信正文,pspvEmail得到发件人电话号码。只要在此处进行判断处理就可以了。
if (wcsstr(pspvSubject->Value.lpszW, L"zzz") != NULL)
{
MessageBeep(MB_ICONASTERISK);
MessageBox(NULL, pspvSubject->Value.lpszW, pspvEmail->Value.lpszW, MB_OK);
// Delete the message and mark it as handled so it won't show up in Inbox
hr = DeleteMessage(pMsgStore, pMsg, cbMsg, lpMsg, cbDestFolder, lpDestFolder, pulEventType, pHandled);
}
从这里我们就可以看出来,它是收到含有"zzz"的短信就把它删除。我们可以进行自己的操作,比如把它保存下来等等。
第二步: 把生成的dll文件拷到手机上(考到手机上任何位置都可以,比如可以自己在设备里新建个文件夹mailrule,把它拷到这个文件里),。下面进入我们自己的程序。
第三步:当你在程序中想进行拦截时调用MailRule.dll的导出函数DllRegisterServer。如果tmail.exe进程已经启动了,我们必须关闭它,重新启动。所以要先查找tmail.exe进程是否已经存在,如果已存在则关闭,然后调用导出函数DllRegisterServer,调用成功后再启动tmail.exe进程。代码如下:
DWORD dwPid=FindProcess(_T("tmail.exe"));
if(0!=dwPid){ //找到进程
HANDLE hHandle=OpenProcess(PROCESS_TERMINATE,FALSE,dwPid); //根据进程ID,获取tmail.exe的句柄
TerminateProcess(hHandle,0); //关闭进程
}
FindProcess函数的实现如下:
DWORD FindProcess(TCHAR* strProcessName)
{
DWORD dwPid = 0; //用于保存tmail.exe的Id
HANDLE hHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS| TH32CS_SNAPNOHEAPS, 0); //为当前系统进程建立快照
DWORD dwId = ::GetCurrentProcessId(); //当前进程的Id
if (INVALID_HANDLE_VALUE !=hHandle) //如果快照建立成功
{
PROCESSENTRY32 stEntry;
stEntry.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hHandle, &stEntry)) //在快照中查找一个进程,stEntry返回进程相关属性和信息
{
do
{
if(wcsstr(stEntry.szExeFile,strProcessName)) //比较该进程名称是否与strProcessName相符
{
if(dwId != stEntry.th32ProcessID) //如果相等,且该进程的Id与当前进程不相等,则找到strProcessName对应的进程。
{
dwPid = stEntry.th32ProcessID;
break;
}
}
}while(Process32Next(hHandle, &stEntry)); //再快照中查找下一个进程。
}
CloseToolhelp32Snapshot(hHandle); //释放快照句柄。
}
return dwPid;
}
//调用导出函数进行注册,由于是dll文件,所以要先把函数导出,代码如下:
LPFDLLREGISTERSERVER lpfUnDllRegisterServer;
hInst = LoadLibrary(L"/mailrule/MapiRule.dll");
if ( NULL == hInst)
{
//异常处理
}
lpfUnDllRegisterServer =(LPFDLLREGISTERSERVER)GetProcAddress(hInst,_T("DllRegisterServer"));
//调用函数
HRESULT hr=lpfUnDllRegisterServer();
//以上都成功后打开tmail.exe进程,当然也可以不打开,如果有短信,或自己进入信箱就会自动打开
CreateProcess(_T("tmail.exe"), _T("-RunInBKG"),NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);
这时候你发指定内容或指定号码的短信时就会被拦截
第四步:当你不想拦截的时候再调用dll中的DllUnregisterServer进行卸载,记住这时一定要关闭tmail.exe进程,否则即使你卸载了也会继续拦截,因为这时的tmail.exe进程依旧是加载拦截功能的进程。
LPFDLLREGISTERSERVER lpfUnDllRegisterServer;
lpfUnDllRegisterServer = (LPFDLLREGISTERSERVER)GetProcAddress(hInst,_T("DllUnregisterServer"));
//调用函数
HRESULT hr = lpfUnDllRegisterServer();
if(FAILED(hr))
{
//异常处理
}
DWORD dwPid=FindProcess(_T("tmail.exe"));
if(0!=dwPid){ //找到进程
HANDLE hHandle=OpenProcess(PROCESS_TERMINATE,FALSE,dwPid); //根据进程ID,获取tmail.exe的句柄
TerminateProcess(hHandle,0); //关闭进程
}
OK.这是我的理解,但不一定对,希望能对像我这样的初学者有用。
参考:
http://blog.csdn.net/Depraved_Survival/archive/2009/03/29/4033458.aspx
http://blog.csdn.net/Depraved_Survival/archive/2009/03/11/3980446.aspx
- wm下拦截指定内容或电话号码的短信
- android 获取手机电话号码和短信内容
- wm下的msxml
- 发送指定内容短信iMessage
- Android-实现对指定电话的短信拦截和来电拦截
- ios 调用短信接口发送指定内容的消息
- ios 调用短信接口发送指定内容的消息
- ios 调用短信接口发送指定内容的消息
- ios 调用短信接口发送指定内容的消息
- iOS 调用短信接口发送指定内容的消息
- 在Dropdownlist选中指定内容或指定值的项
- Eclipse中SVN过滤指定文件夹或文件下内容
- Eclipse中SVN过滤指定文件夹或文件下内容
- Eclipse中SVN过滤指定文件夹或文件下内容
- Eclipse中SVN过滤指定文件夹或文件下内容
- 短信拦截的实现
- 短信的自动拦截
- WM下的MMS开发
- NET框架开发平台的体系架构概览(FCL,CTS,CLS)
- (转帖)vc6--complile通过,但bulid出错误
- CIO精简IT人员的风险与防范
- 二叉树后序遍历的非递归算法
- .NET的3C:CTS、CLS和CLR 以及 IL
- wm下拦截指定内容或电话号码的短信
- 转自BMY 海量数据的处理
- [转]关于团队文化
- ASP.NET 2.0的视图状态持久性机制
- ASP.net:自定义ViewState的保存方式
- sprintf,你知道多少
- FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用
- [转]SourceSafe中的权限管理
- 【视频】配置信息管理 的 使用方法(五):配置程序之列表、分页控件、按钮