В 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 = 0&x00000001,
/// <summary>
/// Prompt the user whether to dial the supplied number.
/// </summary>
PromptBeforeCalling = 0&x00000002,
}
}
Размещаем этот класс в собственной библиотеке, подключаем и используем просто:
PhoneTools phone =
new PhoneTools
();
PhoneTools.
MakeCall("ваш номер");
Возможно этот трюк прокатит и в WM 2003, но я не проверял.