Windows Mobile获取通话记录

来源:互联网 发布:wdcp php版本升级 编辑:程序博客网 时间:2024/04/30 16:55

在现有的.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上测试通过。