首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

windows mobile 程序中拦截指定号码的短信解决思路

2012-01-31 
windows mobile 程序中拦截指定号码的短信大家好!O(∩_∩)O手机多普达,系统Mobile6.0手机上所开发的游戏已经

windows mobile 程序中拦截指定号码的短信
大家好!O(∩_∩)O

手机多普达,系统Mobile6.0
手机上所开发的游戏已经完成,现在希望在程序中在添加一些代码,实现拦截指定号码发送来的短信,
退出游戏后,短信则正常接收!
试了一天也弄不出来,希望大家指点下,(急急急)!!!

我的思路:
1.在程序中开个线程来处理消息循环,用来拦截短信消息,
2.提取短信号码,如果短信是要屏蔽的,则拦截下来,否则,不处理,交给系统处理
3。退出游戏后关闭此线程

可就是不知道用什么API来拦截短信消息(在系统收到短信之前)!!!!!!





[解决办法]
建议楼主先看看SDK下的例子\Common\CPP\Win32\MapiRule。
获取短信发送者的电话号码的关键代码在CMailRuleClient::ProcessMessage函数中,如下:

C/C++ code
SizedSPropTagArray(1, sptaEmail) = { 1, PR_SENDER_EMAIL_ADDRESS}; // get the sender's address or phone numberhr = pMsg->GetProps((SPropTagArray *) &sptaEmail, MAPI_UNICODE, &cValues, &pspvEmail);
[解决办法]
SDK下的mapirule能解决你的问题,不知道你是否已理解这个例子。
[解决办法]
在ProcessMessage这个函数里有这样一句if (wcsstr(pspvSubject->Value.lpszW, L"zzz") != NULL)这个就是判断短信内容为zzz的进行截获,你把这句改成if (wcsstr(pspvEmail->Value.lpszW, L"你要截获的手机号") != NULL)应该就可以了
[解决办法]
mapirule可以拦截的,收到短信时可以加一些逻辑,比如判断你的游戏是否启动等,就可以实现楼主的需求了
[解决办法]

[解决办法]
直接拿mapi的例子就可以吧。判断游戏的进程是否开启,如果开启则pass掉短信。如果关闭,则接收
[解决办法]
贴一段代码给你吧。使用rapi获取来短信的事件。

C/C++ code
int CSMSManager::TestEvent(int flag){    ULONG iInboxCountNow = this->GetInboxCount();    ULONG iSentCountNow = this->GetSentCount();    if (iInboxCountNow > m_iRecieveCount && flag != fnevObjectMoved) {        // 比原来信息多了, 来新短信了        m_iRecieveCount = iInboxCountNow;        m_iSendCount = iSentCountNow;        return EVENT_COMINGSMS;    }    if (iSentCountNow > m_iSendCount) {        m_iRecieveCount = iInboxCountNow;        m_iSendCount = iSentCountNow;        return EVENT_SENDSMS;    }    m_iRecieveCount = iInboxCountNow;    m_iSendCount = iSentCountNow;    return EVENT_NONE;}ULONG CSMSManager::GetInboxCount() const{    if (m_pInboxFolder == NULL) {        return 0;    }    LPMAPITABLE pTable = NULL;    m_pInboxFolder->GetContentsTable(0, &pTable);    ULONG uCount;    pTable->GetRowCount(0, &uCount);    return uCount;}void LedOn(int id) {    NLED_SETTINGS_INFO settings;        settings.LedNum= id;        settings.OffOnBlink= 1;    NLedSetDevice(NLED_SETTINGS_INFO_ID, &settings); }void LedOff(int id) {     NLED_SETTINGS_INFO settings;    settings.LedNum= id;    settings.OffOnBlink= 0;    NLedSetDevice(NLED_SETTINGS_INFO_ID, &settings);}bool CSMSManager::RecieveMsg(LPTSTR lpszSenderFullAdress, LPCTSTR lpszMessageBody){    if (m_pInboxFolder == NULL) {        return false;    }    IMessage *spMessage;    m_pInboxFolder->CreateMessage(NULL, 0 ,&spMessage);    // 增加 Unicode 支持    SPropValue propVals[1];    MAPINAMEID mapiNameId;    ZeroMemory(&mapiNameId, sizeof(mapiNameId));    GUID PS_MAPI = {0x00020328, 0, 0, 0xC0,0,0,0,0,0,0,0x46};    mapiNameId.lpguid = (LPGUID)&PS_MAPI;    mapiNameId.ulKind = MNID_STRING;    mapiNameId.Kind.lpwstrName = L"SMS:Unicode";    LPMAPINAMEID pmapiNameId = &mapiNameId;     LPSPropTagArray psPropArr = NULL;     spMessage->GetIDsFromNames(1, &pmapiNameId, MAPI_CREATE, &psPropArr);     propVals[0].ulPropTag = CHANGE_PROP_TYPE(psPropArr[0].aulPropTag[0], PT_BOOLEAN);    propVals[0].Value.b = TRUE;     spMessage->SetProps(1, propVals, NULL);     MAPIFreeBuffer(psPropArr);     // 设置基本属性    SPropValue    props[5];    ULONG        cProps   = 0;    ZeroMemory(&props, sizeof(props));    // 设置显示窗体类型为“短信”    props[cProps].ulPropTag = PR_MESSAGE_CLASS;    props[cProps].Value.lpszW = TEXT("IPM.SMStext");    ++cProps;    // 短信内容    props[cProps].ulPropTag = PR_SUBJECT;    props[cProps].Value.lpszW = (LPWSTR)lpszMessageBody;    ++cProps;    // 发件人号码    props[cProps].ulPropTag = PR_SENDER_EMAIL_ADDRESS;    props[cProps].Value.lpszW = (LPWSTR)lpszSenderFullAdress;    ++cProps;    // 短信状态标志    props[cProps].ulPropTag = PR_MSG_STATUS;    props[cProps].Value.ul = 0;    ++cProps;    // 短信状态标志    props[cProps].ulPropTag = PR_MESSAGE_FLAGS;    props[cProps].Value.ul = 0;    ++cProps;    spMessage->SetProps(sizeof(props) / sizeof(props[0]), (LPSPropValue)&props, NULL);    spMessage->SaveChanges(FORCE_SAVE);    //震动相关    NLED_COUNT_INFO    nci;    int nIndex = 1;    if (NLedGetDeviceInfo(NLED_COUNT_INFO_ID, (PVOID)&nci))    {        nIndex = (int)nci.cLeds - 1;    }    LedOn(nIndex);    Sleep(3000);    LedOff(nIndex);    return true;}bool CSMSManager::SendMsg(LPTSTR lpszRecipientName, LPTSTR lpszRecipientAdress, LPTSTR lpszMessageBody){    // 没有初始化    if (NULL == m_pFolder) {        return false;    }    IMessage *spMessage;    m_pFolder->CreateMessage(NULL, 0 ,&spMessage);    // 增加 Unicode 支持    SPropValue propVals[1];    MAPINAMEID mapiNameId;    ZeroMemory(&mapiNameId, sizeof(mapiNameId));    GUID PS_MAPI = {0x00020328, 0, 0, 0xC0,0,0,0,0,0,0,0x46};    mapiNameId.lpguid = (LPGUID)&PS_MAPI;    mapiNameId.ulKind = MNID_STRING;    mapiNameId.Kind.lpwstrName = L"SMS:Unicode";    LPMAPINAMEID pmapiNameId = &mapiNameId;     LPSPropTagArray psPropArr = NULL;     spMessage->GetIDsFromNames(1, &pmapiNameId, MAPI_CREATE, &psPropArr);     propVals[0].ulPropTag = CHANGE_PROP_TYPE(psPropArr[0].aulPropTag[0], PT_BOOLEAN);    propVals[0].Value.b = TRUE;     spMessage->SetProps(1, propVals, NULL);     MAPIFreeBuffer(psPropArr);     // 设置收件人属性    SPropValue propRecipient[4];    ULONG        cRecipientProps   = 0;    ZeroMemory(&propRecipient, sizeof(propRecipient));    // 收件人类型    propRecipient[cRecipientProps].ulPropTag = PR_RECIPIENT_TYPE;    propRecipient[cRecipientProps].Value.l = MAPI_TO;    ++cRecipientProps;    // 收件人地址类型    propRecipient[cRecipientProps].ulPropTag = PR_ADDRTYPE;    propRecipient[cRecipientProps].Value.lpszW = _T("SMS");    ++cRecipientProps;    // 收件人姓名    propRecipient[cRecipientProps].ulPropTag = PR_DISPLAY_NAME;    propRecipient[cRecipientProps].Value.lpszW = (LPWSTR)lpszRecipientName;    ++cRecipientProps;    // 收件人号码    propRecipient[cRecipientProps].ulPropTag = PR_EMAIL_ADDRESS;    propRecipient[cRecipientProps].Value.lpszW = (LPWSTR)lpszRecipientAdress;    // 创建地址列表    ADRLIST adrlist;    adrlist.cEntries = 1;    adrlist.aEntries[0].cValues = sizeof(propRecipient) / sizeof(propRecipient[0]);    adrlist.aEntries[0].rgPropVals = (LPSPropValue)(&propRecipient);    spMessage->ModifyRecipients(MODRECIP_ADD, &adrlist);     // 设置基本属性    SPropValue    props[6];    ULONG        cProps   = 0;    ZeroMemory(&props, sizeof(props));    // 设置显示窗体类型为“短信”    props[cProps].ulPropTag = PR_MESSAGE_CLASS;    props[cProps].Value.lpszW = TEXT("IPM.SMStext");    ++cProps;    // 短信内容    props[cProps].ulPropTag = PR_SUBJECT_W;    props[cProps].Value.lpszW = (LPWSTR)lpszMessageBody;    ++cProps;    // 告诉 MAPI 这是一封需要投递的短信    props[cProps].ulPropTag = PR_MSG_STATUS;    props[cProps].Value.ul = MSGSTATUS_RECTYPE_SMS;    ++cProps;    // 表明这是发出的短信    props[cProps].ulPropTag = PR_MESSAGE_FLAGS;    props[cProps].Value.ul = MSGFLAG_FROMME | MSGFLAG_READ;    spMessage->SetProps(sizeof(props) / sizeof(props[0]), (LPSPropValue)&props, NULL);    spMessage->SubmitMessage(FORCE_SUBMIT);    return true;}void CSMSManager::InitMgr(CDataManager* pBindDMgr){    this->InitSession();    this->InitMsgStore();    this->InitInboxFolder();    this->InitSentFolder();    m_pBindDmgr = pBindDMgr;}ULONG CSMSManager::GetSentCount() const{    if (m_pFolder == NULL) {        return 0;    }    LPMAPITABLE pTable = NULL;    m_pFolder->GetContentsTable(0, &pTable);    ULONG uCount;    pTable->GetRowCount(0, &uCount);    return uCount;}void CSMSManager::InitSession(){    m_pSession = NULL;    CoInitializeEx(NULL, COINIT_MULTITHREADED);    MAPIInitialize(NULL);    MAPILogonEx(NULL, NULL, NULL, NULL, &m_pSession);} 


[解决办法]
看看
[解决办法]
精彩!关注,看看
[解决办法]
听lz的意思。好像想屏蔽10086的扣费短信
纯属个人猜测。不带任何攻击和讽刺等意思。。。。
[解决办法]
这个短信拦截的问题,我前几天刚搞定,不过是用C#拦截的。
如果是C++的就是楼上几位介绍的两种方法:MapiRule和rapi
我刚开始使用 MapiRule 也拦截成功了,但是不稳定,有时候拦不到了。
据说是需要数字签名。。。。郁闷的很。

[解决办法]
mark
[解决办法]
我前段时间也拦截了
[解决办法]
路过 强大
[解决办法]
dll是tmail.exe进程加载的, 你加载它做什么, 你在DLL里的那个拦截函数里,拦截到你想要的短息后,给你的程序发个消息就是了。然后该这么处理就这么处理, 不想要短息, 就直接在DLL里delete掉。
[解决办法]
最简单的是使用.net CF,sms类封装的很好,不超过10行搞定,需要代码给我邮件。
guitar2002star@gmail.com

热点排行