当前位置: 代码迷 >> Windows Mobile >> windows mobile 程序中拦截指定号码的短信解决思路
  详细解决方案

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

热度:152   发布时间:2016-04-25 08:01:53.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);}
  相关解决方案