Windows – Send and recieve (intercept) SMS in Windows Mobile 6

smswindows-mobile

I'm developing an application for the Windows Mobile 6 in which it is supposed to capture the SMS with the sender's number and process it. The application also needs to send out SMS to specific numbers as well. What libraries do I utilize to accomplish? Links to tutorials are also needed please.

Update:

Sending SMS: http://msdn.microsoft.com/en-us/library/microsoft.windowsmobile.pocketoutlook.smsmessage.send.aspx

Intercepting Messages: http://msdn.microsoft.com/en-us/library/microsoft.windowsmobile.pocketoutlook.messageinterception.aspx

Best Answer

To receive an SMS in native code(source can be found here). This only catches the latest received SMS:

#include <sms.h>

struct ReceiveSmsMessage     // Define a structure for storing the
{                           // received data of an SMS message
    TCHAR SmsText[200];      // The TCHAR fields are filled in
    TCHAR SmsPhone[50];      // Once all is ready SmsFlag goes True
    bool SmsFlag;            // It is up to the control thread to
} ReadSms;

DWORD SmsMessageThread (LPVOID lpvoid)
{
// This Threads function is to wait for incoming SMS messages and read them as required
// It simply passes the result to the global ReadSms variable and sets its flag to TRUE
// Further processing of the message data is done by the main control thread

    SMS_ADDRESS smsaDestination;
    TEXT_PROVIDER_SPECIFIC_DATA tpsd;

    while(TRUE)
    {
        HANDLE hRead = CreateEvent (NULL, FALSE, FALSE, NULL);
        // Open an SMS Handle
        HRESULT hr = SmsOpen (SMS_MSGTYPE_TEXT, SMS_MODE_RECEIVE, 
                          &smshHandle, &hRead);
        if (hr != ERROR_SUCCESS)
        {
            MessageBox (NULL, TEXT(
                "Unable to get an SMS Read Handle. Please do a warm reset and try again."), 
                TEXT("Error"), MB_OK);
            return 0;
        }

        // Wait for message to come in.
        int rc = WaitForSingleObject (hRead, INFINITE);
        if (rc != WAIT_OBJECT_0) {
            MessageBox (NULL, TEXT("Failure in SMS WaitForSingleObject"), 
                TEXT("Error"), MB_OK);
            SmsClose (smshHandle);
            return 0;
        }
        memset (&smsaDestination, 0, sizeof (smsaDestination));
        DWORD dwSize, dwRead = 0;

        hr = SmsGetMessageSize (smshHandle, &dwSize);

        char *pMessage = (char *)malloc (dwSize+1);
        memset (&tpsd, 0, sizeof (tpsd));
        hr = SmsReadMessage (smshHandle, NULL, &smsaDestination, NULL,
                         (PBYTE)pMessage, dwSize,
                         (PBYTE)&tpsd, sizeof(TEXT_PROVIDER_SPECIFIC_DATA),
                         &dwRead);
        if ((hr == ERROR_SUCCESS) && (ReadSms.SmsFlag == FALSE))
        {
            //Received a message all OK, so pass the results over to the
            //global variable
            pMessage[dwSize] = 0;   //Terminate the string
            wcscpy(ReadSms.SmsText, (TCHAR*)pMessage);
            wcscpy(ReadSms.SmsPhone, TEXT("+"));    //International Number
            wcscat(ReadSms.SmsPhone, (TCHAR*)smsaDestination.ptsAddress);
            ReadSms.SmsFlag = TRUE;         
        }

        free (pMessage);
        SmsClose (smshHandle);
        CloseHandle(hRead);
    }

    return 0;
}

For C# look at MessageInterceptor, though I am not familiar with the method to read the message itself.

You can also download OpenNetCF SDF 1.4 source code and fill in the missing functionality of the receive part (it's commented out).