Я безумен

2009-02-2

.Net CF программное управление bluetooth

Filed under: .NET,Разработка,Windows Mobile — thekillerfox @ 1:56 пп
Tags: , , , ,

Для начала нам нужно подключить пространство имен System.Runtime.InteropServices

using System.Runtime.InteropServices;

Теперь создаем свой класс :

public class Network
{
     public enum BluetoothMode
     {
          Off=0,
          Connectable=1,
          Discoverable=2
     }
     [DllImport("BthUtil.dll")]
     private static extern int BthGetMode(out BluetoothMode dwMode);
     [DllImport("BthUtil.dll")]
     public static extern int BthSetMode(BluetoothMode dwMode);
     public static String GetBthMode()
     {
          BluetoothMode mode;
          int ret = BthGetMode(out mode);
          return mode.ToString();
     }
}

Теперь мы можем попробовать переключить статусы. Например вот так :

if (Network.GetBthMode() == "Off")  //Проверяем текущее состояние
    Network.BthSetMode(Network.BluetoothMode.Connectable); //Переводим в состояние Connectable
else Network.BthSetMode(Network.BluetoothMode.Off); // или же выключаем

Как программно позвонить в WM5, WM6

Filed under: .NET,Разработка,Windows Mobile — thekillerfox @ 1:40 пп
Tags: , , , , ,

В 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, но я не проверял.

Создайте бесплатный сайт или блог на WordPress.com.