大家好!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);}