在Windows Mobile 開發過程中,很多時候需要讀取短信收件夾及發件夾里的數據,當然C#是很難實現這個的,因為微軟沒有對底層API進行封裝,此時,C++又出來了,通過C++封裝一個DLL,然后在C#中調用即可(沒辦法,C++)總是那么強。
具體的C++封裝我這里不詳細介紹,其實也不是我封裝的,是別人寫的,這里引用過來。
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
??? public class NetMAPI:IDisposable???????
??? {
??????? protected IntPtr pMAPI;
??????? public NetMAPI()
??????? {
??????????? pMAPI = IntPtr.Zero;
??????? }
??????? ~NetMAPI()
??????? {
??????????? Dispose(false);
??????? }
??????? public void Dispose()
??????? {
??????????? Dispose(true);
??????????? GC.SuppressFinalize(this);
??????? }
??????? protected virtual void Dispose(bool disposing)
??????? {
??????????? Logout();
??????? }
??????? public IntPtr MAPI
??????? {
??????????? get { return pMAPI; }
??????? }
??????? public bool Login()
??????? {
??????????? if (pMAPI == IntPtr.Zero) pMAPI = MAPILogin();
??????????? return (pMAPI != IntPtr.Zero);
??????? }
??????? public void Logout()
??????? {
??????????? if (pMAPI != IntPtr.Zero)
??????????? {
??????????????? MAPILogout(pMAPI);
??????????????? pMAPI = IntPtr.Zero;
??????????? }
??????? }
??????? public bool OpenMessageStore()
??????? {
??????????? return MAPIOpenMessageStore(pMAPI);
??????? }
??????? public bool GetNextMessage(out SmsMessage message, bool bUnreadOnly)
??????? {
??????????? IntPtr pMessage;
??????????? message = null;
??????????? if (MAPIGetNextMessage(pMAPI, out pMessage, bUnreadOnly))
??????????? {
??????????????? message = new SmsMessage(pMessage);
??????????? }
??????????? return (message != null);
??????? }
??????? public bool GetContents()
??????? {
??????????? return GetContents(IntPtr.Zero);
??????? }
??????? public bool OpenInbox()
??????? {
??????????? return MAPIOpenInbox(pMAPI);
??????? }
??????? /// <summary>
??????? /// Opens the Outbox folder
??????? /// </summary>
??????? /// <returns>true on success</returns>
??????? public bool OpenOutbox()
??????? {
??????????? return MAPIOpenOutbox(pMAPI);
??????? }
??????? /// <summary>
??????? /// Opens the Sent Items folder
??????? /// </summary>
??????? /// <returns>true on success</returns>
??????? public bool OpenSentItems()
??????? {
??????????? return MAPIOpenSentItems(pMAPI);
??????? }
??????? /// <summary>
??????? /// Opens the Deleted Items folder
??????? /// </summary>
??????? /// <returns>true on success</returns>
??????? public bool OpenDeletedItems()
??????? {
??????????? return MAPIOpenDeletedItems(pMAPI);
??????? }
??????? /// <summary>
??????? /// Opens the Drafts folder
??????? /// </summary>
??????? /// <returns>true on success</returns>
??????? public bool OpenDrafts()
??????? {
??????????? return MAPIOpenDrafts(pMAPI);
??????? }
??????? /// <summary>
??????? /// Opens the contents of a specific folder
??????? /// </summary>
??????? /// <param name="pFolder"></param>
??????? /// <returns>true on success</returns>
??????? public bool GetContents(IntPtr pFolder)
??????? {
??????????? return MAPIGetContents(pMAPI, pFolder);
??????? }
??????? public int GetRowCounts()
??????? {
??????????? return MAPIGetRowCount(pMAPI);
??????? }
??????? [DllImport("ReadSMS.dll")]
??????? public static extern bool MAPIInit();
??????? [DllImport("ReadSMS.dll", EntryPoint = "MAPITerm")]
??????? public static extern void Term();
??????? // Profiles, Message Store
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern IntPtr MAPILogin();
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern void MAPILogout(IntPtr pMAPI);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MAPIOpenMessageStore(IntPtr pMAPI);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MAPIGetContents(IntPtr pMAPI, IntPtr pFolder);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern int MAPIGetRowCount(IntPtr pMAPI);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MAPIOpenInbox(IntPtr pMAPI);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MAPIOpenOutbox(IntPtr pMAPI);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MAPIOpenSentItems(IntPtr pMAPI);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MAPIOpenDeletedItems(IntPtr pMAPI);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MAPIOpenDrafts(IntPtr pMAPI);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MAPIGetNextMessage(IntPtr pMAPI, out IntPtr pMessage, bool bUnreadOnly);
??? }
接下來封裝一個短信對象
??? public class SmsMessage:IDisposable
??? {
??????? public enum RecipientType { UNKNOWN, TO, CC, BCC };
??????? protected IntPtr pMessage;
??????? public SmsMessage()
??????? {
??????????? pMessage = IntPtr.Zero;
??????? }
??????? public SmsMessage(IntPtr pMessage)
??????? {
??????????? this.pMessage = pMessage;
??????? }
??????? ~SmsMessage()
??????? {
??????????? Dispose(false);
??????? }
??????? public void Dispose()
??????? {
??????????? Dispose(true);
??????????? GC.SuppressFinalize(this);
??????? }
??????? protected virtual void Dispose(bool disposing)
??????? {
??????????? if (pMessage != IntPtr.Zero)
??????????? {
??????????????? MessageClose(pMessage);
??????????????? pMessage = IntPtr.Zero;
??????????? }
??????? }
??????? public IntPtr MessagePointer { get { return pMessage; } }
??????? public void GetSenderName(StringBuilder strSenderName)
??????? {
??????????? MessageGetSenderName(pMessage, strSenderName, strSenderName.Capacity);
??????? }
??????? public void GetSenderEmail(StringBuilder strSenderEmail)
??????? {
??????????? MessageGetSenderEmail(pMessage, strSenderEmail, strSenderEmail.Capacity);
??????? }
??????? public void GetSubject(StringBuilder strSubject)
??????? {
??????????? MessageGetSubject(pMessage, strSubject, strSubject.Capacity);
??????? }
??????? /// <summary>
??????? /// Gets the received time
??????? /// </summary>
??????? /// <param name="dt">DateTime received</param>
??????? /// <returns>true on success</returns>
??????? public bool GetReceivedTime(out DateTime dt)
??????? {
??????????? int nYear, nMonth, nDay, nHour, nMinute, nSecond;
??????????? bool bResult = MessageGetReceivedTime(pMessage, out nYear,
out nMonth, out nDay, out nHour, out nMinute, out nSecond);
??????????? dt = new DateTime(nYear, nMonth, nDay, nHour, nMinute, nSecond);
??????????? return bResult;
??????? }
??????? /// <summary>
??????? /// Gets the received time using the default format (MM/dd/yyyy hh:mm:ss tt)
??????? /// </summary>
??????? /// <param name="strReceivedTime">buffer to receive</param>
??????? /// <returns>true on success</returns>
??????? public bool GetReceivedTime(StringBuilder strReceivedTime)
??????? {
??????????? return MessageGetReceivedTimeString(pMessage, strReceivedTime, strReceivedTime.Capacity, "");
??????? }
??????? /// <summary>
??????? /// Gets the received time
??????? /// </summary>
??????? /// <param name="strReceivedTime">buffer to receive</param>
??????? /// <param name="strFormat">format string for date (empty for default)</param>
??????? /// <returns>true on success</returns>
??????? public bool GetReceivedTime(StringBuilder strReceivedTime, string strFormat)
??????? {
??????????? return MessageGetReceivedTimeString(pMessage, strReceivedTime, strReceivedTime.Capacity, strFormat);
??????? }
??????? /// <summary>
??????? /// Gets the submit time
??????? /// </summary>
??????? /// <param name="dt">DateTime submitted</param>
??????? /// <returns>true on success</returns>
??????? public bool GetSubmitTime(out DateTime dt)
??????? {
??????????? int nYear, nMonth, nDay, nHour, nMinute, nSecond;
??????????? bool bResult = MessageGetSubmitTime(pMessage, out nYear,
out nMonth, out nDay, out nHour, out nMinute, out nSecond);
??????????? dt = new DateTime(nYear, nMonth, nDay, nHour, nMinute, nSecond);
??????????? return bResult;
??????? }
??????? /// <summary>
??????? /// Gets the submit time using the default format (MM/dd/yyyy hh:mm:ss tt)
??????? /// </summary>
??????? /// <param name="strSubmitTime">buffer to receive</param>
??????? /// <returns>true on success</returns>
??????? public bool GetSubmitTime(StringBuilder strSubmitTime)
??????? {
??????????? return MessageGetSubmitTimeString(pMessage, strSubmitTime, strSubmitTime.Capacity, "");
??????? }
??????? /// <summary>
??????? /// Gets the submit time
??????? /// </summary>
??????? /// <param name="strSubmitTime">buffer to receive</param>
??????? /// <param name="strFormat">format string for date (empty for default)</param>
??????? /// <returns>true on success</returns>
??????? public bool GetSubmitTime(StringBuilder strSubmitTime, string strFormat)
??????? {
??????????? return MessageGetSubmitTimeString(pMessage, strSubmitTime, strSubmitTime.Capacity, strFormat);
??????? }
??????? /// <summary>
??????? /// Get the recipients table, call this before calling GetNextRecipient
??????? /// </summary>
??????? /// <returns>true on success</returns>
??????? public bool GetRecipients()
??????? {
??????????? return MessageGetRecipients(pMessage);
??????? }
??????? /// <summary>
??????? /// Gets the next recipient
??????? /// </summary>
??????? /// <param name="strName">Name of recipient</param>
??????? /// <param name="strEmail">Email of recipient</param>
??????? /// <param name="nType">RecipientType (TO, CC, BCC)</param>
??????? /// <returns>true on success</returns>
??????? public bool GetNextRecipient(StringBuilder strName, StringBuilder strEmail, out RecipientType nType)
??????? {
??????????? int nRecipientType;
??????????? nType = RecipientType.UNKNOWN;
??????????? if (MessageGetNextRecipient(pMessage, strName, strName.Capacity, strEmail, strEmail.Capacity, out nRecipientType))
??????????? {
??????????????? nType = (RecipientType)nRecipientType;
??????????????? return true;
??????????? }
??????????? return false;
??????? }
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern void MessageClose(IntPtr pMessage);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern void MessageGetSenderName(IntPtr pMessage, StringBuilder strSenderName, int nMaxLength);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern void MessageGetSenderEmail(IntPtr pMessage, StringBuilder strSenderEmail, int nMaxLength);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern void MessageGetSubject(IntPtr pMessage, StringBuilder strSubject, int nMaxLength);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MessageGetReceivedTime(IntPtr
pMessage, out int nYear, out int nMonth, out int nDay, out int nHour,
out int nMinute, out int nSecond);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool
MessageGetReceivedTimeString(IntPtr pMessage, StringBuilder
strReceivedTime, int nMaxLength, string szFormat);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MessageGetSubmitTime(IntPtr
pMessage, out int nYear, out int nMonth, out int nDay, out int nHour,
out int nMinute, out int nSecond);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MessageGetSubmitTimeString(IntPtr
pMessage, StringBuilder strSubmitTime, int nMaxLength, string szFormat);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MessageGetRecipients(IntPtr pMessage);
??????? [DllImport("ReadSMS.dll")]
??????? protected static extern bool MessageGetNextRecipient(IntPtr
pMessage, StringBuilder strName, int nMaxLenName, StringBuilder
strEmail, int nMaxLenEmail, out int nType);
??? }
獲取收件夾數據
??????? /// <summary>
??????? /// 讀取收件夾用戶數據
??????? /// </summary>
??????? /// <param name="sender"></param>
??????? /// <param name="e"></param>
??????? private void buttonEX1_Click(object sender, EventArgs e)
??????? {
??????????? try
??????????? {
??????????????? Cursor.Current = Cursors.WaitCursor;
??????????????? this.listViewEX1.Columns[0].Text = "發件人";
??????????????? if (!NetMAPI.MAPIInit())
??????????????? {
??????????????????? MessageBox.Show("打開發件夾失敗", "系統提示",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk,
MessageBoxDefaultButton.Button1);
??????????????? }
??????????????? else
??????????????? {
??????????????????? if (this.rDs == null)
??????????????????? {
??????????????????????? rDs = new DataSet();
??????????????????????? DataTable dt = new DataTable();
??????????????????????? dt.Columns.Add("Num");
??????????????????????? dt.Columns.Add("Content");
??????????????????????? rDs.Tables.Add(dt);
??????????????????????? NetMAPI tmapi = new NetMAPI();
??????????????????????? if (tmapi.Login())
??????????????????????? {
??????????????????????????? if ((tmapi.OpenMessageStore() && tmapi.OpenInbox()) && tmapi.GetContents())
??????????????????????????? {
??????????????????????????????? SmsMessage message;
??????????????????????????????? StringBuilder strSenderName = new StringBuilder(1024);
??????????????????????????????? int num = 0;
??????????????????????????????? while (tmapi.GetNextMessage(out message, false))
??????????????????????????????? {
??????????????????????????????????? DataRow dr = rDs.Tables[0].NewRow();
??????????????????????????????????? num++;
??????????????????????????????????? CF.Forms.ListViewItem it = new CF.Forms.ListViewItem();
??????????????????????????????????? message.GetSenderName(strSenderName);
??????????????????????????????????? dr["Num"] = strSenderName.ToString().Replace("+86", "");
??????????????????????????????????? message.GetSubject(strSenderName);
??????????????????????????????????? dr["Content"] = strSenderName.ToString();
??????????????????????????????????? message.Dispose();
??????????????????????????????????? this.rDs.Tables[0].Rows.Add(dr);
??????????????????????????????????? if (num > 0xed)
??????????????????????????????????? {
??????????????????????????????????????? break;
??????????????????????????????????? }
??????????????????????????????? }
??????????????????????????? }
??????????????????????????? tmapi.Logout();
??????????????????????? }
??????????????????? }
??????????????????? NetMAPI.Term();
??????????????????
??????????????? }
??????????????? //綁定數據集合
??????????????? this.listViewEX1.ListDataSet = rDs;
??????????????? this.listViewNavigateEX1.RowsTotalCount = rDs.Tables[0].Rows.Count; ;
??????????????? this.listViewNavigateEX1.ShowPageIndex();
??????????? }
??????????? catch (Exception ep)
??????????? {
#if DEBUG
??????????????? MessageBox.Show(ep.Message);
#endif
??????????????? MessageBox.Show("讀取收件夾短信數據時發生錯誤!", "系統提示",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk,
MessageBoxDefaultButton.Button1);
??????????? }
??????????? finally
??????????? {
??????????????? Cursor.Current = Cursors.Default;
??????????? }
??????? }
獲取已發送短信數據
private void buttonEX2_Click(object sender, EventArgs e)
??????? {
??????????? try
??????????? {
??????????????? Cursor.Current = Cursors.WaitCursor;
??????????????? this.listViewEX1.Columns[0].Text = "收件人";
??????????????? if (this.sDs == null)
??????????????? {
??????????????????? sDs = new DataSet();
??????????????????? DataTable dt = new DataTable();
??????????????????? dt.Columns.Add("Num");
??????????????????? dt.Columns.Add("Content");
??????????????????? sDs.Tables.Add(dt);
??????????????????? if (NetMAPI.MAPIInit())
??????????????????? {
??????????????????????? NetMAPI tmapi = new NetMAPI();
??????????????????????? if (tmapi.Login())
??????????????????????? {
??????????????????????????? if ((tmapi.OpenMessageStore() && tmapi.OpenSentItems()) && tmapi.GetContents())
??????????????????????????? {
??????????????????????????????? SmsMessage message;
??????????????????????????????? StringBuilder strSubject = new StringBuilder(1024);
??????????????????????????????? StringBuilder strName = new StringBuilder(0x19);
??????????????????????????????? StringBuilder strEmail = new StringBuilder(0x19);
??????????????????????????????? int num = 0;
??????????????????????????????? while (tmapi.GetNextMessage(out message, false))
??????????????????????????????? {
??????????????????????????????????? DataRow dr = sDs.Tables[0].NewRow();
??????????????????????????????????? SmsMessage.RecipientType type;
??????????????????????????????????? num++;
??????????????????????????????????? CF.Forms.ListViewItem it = new CF.Forms.ListViewItem();
??????????????????????????????????? message.GetRecipients();
??????????????????????????????????? message.GetNextRecipient(strName, strEmail, out type);
???????????????????????????????????? dr["Num"] = strName.ToString().Replace("+86", "");
??????????????????????????????????? message.GetSubject(strSubject);
??????????????????????????????????? dr["Content"] = strSubject.ToString();
??????????????????????????????????? message.Dispose();
??????????????????????????????????? this.sDs.Tables[0].Rows.Add(dr);
??????????????????????????????? }
??????????????????????????? }
??????????????????????????? tmapi.Logout();
??????????????????????? }
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? MessageBox.Show("讀取發件夾短息數據失敗!", "系統提示",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk,
MessageBoxDefaultButton.Button1);
??????????????????? }
??????????????????? NetMAPI.Term();
??????????????? }
??????????????? //綁定數據
??????????????? this.listViewEX1.ListDataSet = sDs;
??????????????? this.listViewNavigateEX1.RowsTotalCount = sDs.Tables[0].Rows.Count; ;
??????????????? this.listViewNavigateEX1.ShowPageIndex();
??????????? }
??????????? catch (Exception ep)
??????????? {
#if DEBUG
??????????????? MessageBox.Show(ep.Message);
#endif
??????????????? MessageBox.Show("讀取發件夾短信數據時發生錯誤!", "系統提示",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk,
MessageBoxDefaultButton.Button1);
??????????? }
??????????? finally
??????????? {
??????????????? Cursor.Current = Cursors.Default;
??????????? }
??????? }
OK,到此為止,一切都搞定。
轉自:http://hi.baidu.com/thepurpledream/blog/item/1148fe1846f79cb14aedbc81.html
posted on 2009-05-11 10:49
收藏也是種愛好 閱讀(522)
評論(0) 編輯 收藏 引用 所屬分類:
Windows Mobile編程