В Windows Mobile 6 был значительно расширен .Net Compact Framework и то для чего раньше требовалось много шаманство теперь делается в две строчки.
Например чтобы позвонить надо всего лишь подключить пространство имен конструкцией :
using Microsoft.WindowsMobile.Telephony;
А в коде создать экземпляр класса Microsoft.WindowsMobile.Telephony.Phone:
Phone phone = new Phone();
phone.Talk("ваш номер тут");
Это очень удобно, но если вы пишете программы под Windows Mobile желательно не ориентироваться только на последнюю версию этой ОС, и обратить внимание еще на предыдущию версию, так как многие девайсы не имеют прошивок на WM6 или же прошивки неоффициальные и не каждый согласиться лишить себя гарантии прошивая непойми что.
Для этого можно подкючить
OpenNet CF где уже реализована поддержка необходимых классов. Старая версия фреймворка доступна на бесплатной основе. Покопавшись в ней я выдернул класс отвечающий за звонки.
Для его работы надо подключить Пространство имен System.Runtime.InteropServices.
using System.Runtime.InteropServices;
public class PhoneTools
{
/// <summary>
/// Make a voice call to the specified number.
/// </summary>
/// <param name="destination">A valid phone number to be dialled.</param>
/// <returns>True if successful else False</returns>
public static bool MakeCall(string destination)
{
return MakeCall(destination, false, null);
}
/// <summary>
/// Make a voice call to the specified number optionally prompting the user before dialling.
/// </summary>
/// <param name="destination">A valid phone number to be dialled.</param>
/// <param name="prompt">If True user will be prompted before call is made, else call will be made without user intervention.</param>
/// <returns>True if successful else False</returns>
public static bool MakeCall(string destination, bool prompt)
{
return MakeCall(destination, prompt, null);
}
/// <summary>
/// Make a voice call to the specified number optionally prompting the user before dialling.
/// </summary>
/// <param name="destination">A valid phone number to be dialled.</param>
/// <param name="prompt">If True user will be prompted before call is made, else call will be made without user intervention.</param>
/// <param name="calledParty">A display name for the party being called.</param>
/// <returns>True if successful else False</returns>
public static bool MakeCall(string destination, bool prompt, string calledParty)
{
//setup structure for native call
MakeCallInfo mci = new MakeCallInfo();
mci.cbSize = 24;
mci.pszDestAddress = Apps.StringToHGlobalUni(destination);
if(calledParty!=null)
{
mci.pszCalledParty = Apps.StringToHGlobalUni(calledParty);
}
if(prompt)
{
mci.dwFlags = CallFlags.PromptBeforeCalling;
}
else
{
mci.dwFlags = CallFlags.Default;
}
//call native function
int result = PhoneMakeCall(ref mci);
//free strings
if(mci.pszDestAddress!=IntPtr.Zero)
{
Apps.FreeHGlobal(mci.pszDestAddress);
}
if(mci.pszCalledParty!=IntPtr.Zero)
{
Apps.FreeHGlobal(mci.pszCalledParty);
}
//check return value
if(result==0)
{
return true;
}
else
{
return false;
}
}
[DllImport("phone.dll", SetLastError = true)]
private static extern int PhoneMakeCall(ref MakeCallInfo ppmci);
//used internally by PhoneMakeCallInfo
private struct MakeCallInfo
{
public int cbSize;
public CallFlags dwFlags;
public IntPtr pszDestAddress;
IntPtr pszAppName;
public IntPtr pszCalledParty;
IntPtr pszComment;
}
/// <summary>
/// Flags which determine the behaviour of the <see cref="M:OpenNETCF.Phone.Phone.MakeCall"/> function.
/// </summary>
private enum CallFlags : int
{
/// <summary>
/// Do not prompt, dial the supplied number.
/// </summary>
Default = 0x00000001,
/// <summary>
/// Prompt the user whether to dial the supplied number.
/// </summary>
PromptBeforeCalling = 0x00000002,
}
}
Размещаем этот класс в собственной библиотеке, подключаем и используем просто:
PhoneTools phone = new PhoneTools();
PhoneTools.MakeCall("ваш номер");
Возможно этот трюк прокатит и в WM 2003, но я не проверял.