
摘要:学习如何从基于 .NET Framework 精简版的应用程序访问电话 API。
简介
本文旨在通过另外一个示例,说明在用 C# 和 VB.NET 编写的托管代码中调用本机 Microsoft? Win32? API 是大有裨益的。下面,我们看看 Pocket PC Phone Edition 支持的通用电话 API。
使用 C# 创建电话呼叫
本文下面所引用的所有代码都可以从此处下载(英文)。创建呼叫是一个基本操作;我们传递 PhoneMakeCall (Win32 API),它是一个字符串,指示目标地址以及是否需要在呼叫前确认等操作。我们需要进行多项声明。
private static long PMCF_DEFAULT = 0x00000001;
private static long PMCF_PROMPTBEFORECALLING = 0x00000002;
然后定义一个对我们的目的用途不太大的结构。
private struct PhoneMakeCallInfo { public IntPtr cbSize; public IntPtr dwFlags; public IntPtr pszDestAddress; public IntPtr pszAppName; public IntPtr pszCalledParty; public IntPtr pszComment; } |
cbSize 表明 PhoneMakeCallInfo 结构的大小。dwFlags 是一个选项位,用于指定呼叫前是否提示用户。pszDestAddress 是一个指针,指向要拨打的电话号码。当前不支持 pszAppName。pszCalledParty 为可选项,表示被叫方的姓名,大小有限。当前不支持 pszComment。现在,我们激活 PInvoke 并调用 DLLImport,以便访问 API 函数 PhoneMakeCall。
[DllImport("phone.dll")]
private static extern IntPtr PhoneMakeCall(ref PhoneMakeCallInfo ppmci);
为了方便起见,我们包含了一个辅助函数,以便省略拨号前确认 Boolean。
/// <summary> /// 拨打指定的电话号码。 /// </summary> /// <param name="PhoneNumber">要拨打的电话号码。</param> public static void MakeCall(string PhoneNumber) { MakeCall(PhoneNumber, false); } |
下面介绍一下 MakeCall 的功能。简而言之,我们将 PhoneNumber 参数(作为字符串传递)分割成一个字符数组。
PhoneNumber += '\0';
char[] cPhoneNumber = PhoneNumber.ToCharArray();
指向字符数组在内存中的内存地址,并为此变量加上 fixed 关键字,表示不希望内存回收器移动固定括号内的内容。
|
PhoneMakeCallInfo info = new PhoneMakeCallInfo(); info.cbSize = (IntPtr)Marshal.SizeOf(info); info.pszDestAddress = (IntPtr)pAddr;
if (PromptBeforeCall) { info.dwFlags = (IntPtr)PMCF_PROMPTBEFORECALLING; } else { info.dwFlags = (IntPtr)PMCF_DEFAULT; } |
创建一个新的 PhoneMakeCallInfo 结构实例,指示是否希望在拨号之前进行确认以及是否将电话号码插入 pszDestAddress 字段。最后,我们将该结构实例作为引用传入 PhoneMakeCall。此函数使用 unsafe 关键字进行了修饰,因为它使用指针和直接内存访问。