Windows Mobile获取通话记录 C# 文章作者:alalmn文章作者:[E.S.T] alalmn 信息来源:邪恶八进制信息安全团队(www.eviloctal.com)飞龙 QQ316118740 飞龙 BLOG http://hi.baidu.com/alalmn 在现有的.net compact framework中,无论是1.0、2.0还是3.5版本,都没有直接获取用户通话记录的接口,那么,我们只能自己封装底层API来实现了。该接口在phone.dll中,调用PhoneGetCallLogEntry方法会返回一个通话记录结构,在该结构中,包含号码、姓名、通话开始时间、通话结束时间等信息。在我们调用此API之前,首先要PhoneOpenCallLog打开通话记录句柄,同时在操作结束后,要调用PhoneCloseCallLog关闭句柄,废话少说,看代码。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
using
System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Microsoft.WindowsMobile.PocketOutlook;
namespace _234
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[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 )] // 首先要PhoneOpenCallLog打开通话记录句柄
private static extern int PhoneOpenCallLog( ref IntPtr pHandle);
[DllImport( " phone.dll " , EntryPoint = " PhoneCloseCallLog " , SetLastError = true )] // 要调用PhoneCloseCallLog关闭句柄
private static extern int PhoneCloseCallLog(IntPtr pHandle);
[DllImport( " phone.dll " , EntryPoint = " PhoneGetCallLogEntry " , SetLastError = true )]
private static extern int PhoneGetCallLogEntry(IntPtr pHandke, ref CALLLOGENTRY pEntry);
// 用PhoneGetCallLogEntry方法会返回一个通话记录结构,在该结构中,包含号码、姓名、通话开始时间、通话结束时间等信息。
private void button1_Click( object sender, EventArgs e)
{
string CallInfo = "" ;
try
{
IntPtr handle = IntPtr.Zero; // 句柄
CALLLOGENTRY entry = new CALLLOGENTRY();
PhoneOpenCallLog( ref handle); // 首先要PhoneOpenCallLog打开通话记录句柄
entry.cbSize = ( uint )Marshal.SizeOf(entry); // 返回类的非托管大小
if (handle != IntPtr.Zero)
{
while (PhoneGetCallLogEntry(handle, ref entry) == 0 ) // 获取通话记录
{ // Marshal.PtrToStringUni 复制指定数目的字符
string phoneNumber = Marshal.PtrToStringUni(entry.pszNumber); // 号码
string name = Marshal.PtrToStringUni(entry.pszName); // 姓名
if (phoneNumber == null )
{
phoneNumber = string .Empty;
}
if (name == null )
{
name = string .Empty;
}
string temp = (phoneNumber.Trim() + name.Trim());
CallInfo = CallInfo + temp;
}
PhoneCloseCallLog(handle);
// MessageBox.Show("1111111");
// MessageBox.Show(CallInfo.Substring(0, 140));
textBox1.Text = CallInfo;
MessageBox.Show( " 字符数: " + CallInfo.Length );
// Microsoft.WindowsMobile.PocketOutlook.SmsMessage sms = new SmsMessage("151608XXXXXX", CallInfo.Substring(0, 140));
// sms.Send();
}
else
{
int error = Marshal.GetLastWin32Error();
}
}
catch (Exception ep)
{
}
finally
{
}
}
private void button2_Click( object sender, EventArgs e)
{
Microsoft.WindowsMobile.PocketOutlook.SmsMessage sms = new SmsMessage(textBox3.Text, textBox2.Text); // 号码 内容
sms.Send();
}
// private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
// {
// }
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Microsoft.WindowsMobile.PocketOutlook;
namespace _234
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[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 )] // 首先要PhoneOpenCallLog打开通话记录句柄
private static extern int PhoneOpenCallLog( ref IntPtr pHandle);
[DllImport( " phone.dll " , EntryPoint = " PhoneCloseCallLog " , SetLastError = true )] // 要调用PhoneCloseCallLog关闭句柄
private static extern int PhoneCloseCallLog(IntPtr pHandle);
[DllImport( " phone.dll " , EntryPoint = " PhoneGetCallLogEntry " , SetLastError = true )]
private static extern int PhoneGetCallLogEntry(IntPtr pHandke, ref CALLLOGENTRY pEntry);
// 用PhoneGetCallLogEntry方法会返回一个通话记录结构,在该结构中,包含号码、姓名、通话开始时间、通话结束时间等信息。
private void button1_Click( object sender, EventArgs e)
{
string CallInfo = "" ;
try
{
IntPtr handle = IntPtr.Zero; // 句柄
CALLLOGENTRY entry = new CALLLOGENTRY();
PhoneOpenCallLog( ref handle); // 首先要PhoneOpenCallLog打开通话记录句柄
entry.cbSize = ( uint )Marshal.SizeOf(entry); // 返回类的非托管大小
if (handle != IntPtr.Zero)
{
while (PhoneGetCallLogEntry(handle, ref entry) == 0 ) // 获取通话记录
{ // Marshal.PtrToStringUni 复制指定数目的字符
string phoneNumber = Marshal.PtrToStringUni(entry.pszNumber); // 号码
string name = Marshal.PtrToStringUni(entry.pszName); // 姓名
if (phoneNumber == null )
{
phoneNumber = string .Empty;
}
if (name == null )
{
name = string .Empty;
}
string temp = (phoneNumber.Trim() + name.Trim());
CallInfo = CallInfo + temp;
}
PhoneCloseCallLog(handle);
// MessageBox.Show("1111111");
// MessageBox.Show(CallInfo.Substring(0, 140));
textBox1.Text = CallInfo;
MessageBox.Show( " 字符数: " + CallInfo.Length );
// Microsoft.WindowsMobile.PocketOutlook.SmsMessage sms = new SmsMessage("151608XXXXXX", CallInfo.Substring(0, 140));
// sms.Send();
}
else
{
int error = Marshal.GetLastWin32Error();
}
}
catch (Exception ep)
{
}
finally
{
}
}
private void button2_Click( object sender, EventArgs e)
{
Microsoft.WindowsMobile.PocketOutlook.SmsMessage sms = new SmsMessage(textBox3.Text, textBox2.Text); // 号码 内容
sms.Send();
}
// private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
// {
// }
}
}
在windows mobile5.0和windows mobile6.0上测试通过。
转载自:http://hi.baidu.com/alalmn/blog/item/58188dd398367439970a1659.html