天天看點

Windows Mobile擷取通話記錄

在現有的.net compact framework中,無論是1.0、2.0還是3.5版本,都沒有直接擷取使用者通話記錄的接口,那麼,我們隻能自己封裝底層API來實作了。

改接口在phone.dll中,調用PhoneGetCallLogEntry方法會傳回一個通話記錄結構,在該結構中,包含号碼、姓名、通話開始時間、通話結束時間等資訊。在我們調用此API之前,首先要PhoneOpenCallLog打開通話記錄句柄,同時在操作結束後,要調用 PhoneCloseCallLog關閉句柄,廢話少說,看代碼。

[StructLayout(LayoutKind.Sequential)]

public struct CALLLOGENTRY

{

public UInt32 cbSize;

public UInt64 ftStartTime;

public UInt64 ftEndTime;

public short iom;

public bool fOutgoing;

public bool fConnected;

public bool fEnded;

public bool fRoam;

public short cidt;

public IntPtr pszNumber;

public IntPtr pszName;

public IntPtr pszNameType;

public IntPtr pszNote;

};

[DllImport("phone.dll", EntryPoint = "PhoneOpenCallLog", SetLastError = true)]

private static extern int PhoneOpenCallLog(ref IntPtr pHandle);

[DllImport("phone.dll", EntryPoint = "PhoneCloseCallLog", SetLastError = true)]

private static extern int PhoneCloseCallLog(IntPtr pHandle);

[DllImport("phone.dll", EntryPoint = "PhoneGetCallLogEntry", SetLastError = true)]

private static extern int PhoneGetCallLogEntry(IntPtr pHandke, ref CALLLOGENTRY pEntry);

//下面是測試代碼

/// <summary>

/// 擷取通話記錄

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void button2_Click(object sender, EventArgs e)

try

Cursor.Current = Cursors.WaitCursor;

IntPtr handle = IntPtr.Zero;

CALLLOGENTRY entry = new CALLLOGENTRY();

PhoneOpenCallLog(ref handle);

entry.cbSize = (uint)Marshal.SizeOf(entry);

if (handle != IntPtr.Zero)

listView.Items.Clear();

listView.Columns[0].Width = this.Width;

while (PhoneGetCallLogEntry(handle, ref entry) == 0)

string phoneNumber = Marshal.PtrToStringUni(entry.pszNumber);

string name = Marshal.PtrToStringUni(entry.pszName);

if (name == null)

name = string.Empty;

}

ListViewItem item = new ListViewItem(phoneNumber.Trim());

item.SubItems.Add(name.Trim());

listView.Items.Add(item);

PhoneCloseCallLog(handle);

else

int error = Marshal.GetLastWin32Error();

catch (Exception ep)

MessageBox.Show(ep.Message);

finally

Cursor.Current = Cursors.Default;

在windows mobile5.0和windows mobile6.0上測試通過。

     本文轉自xyz_lmn51CTO部落格,原文連結:http://blog.51cto.com/xyzlmn/819933,如需轉載請自行聯系原作者

繼續閱讀