Включение виброзвонка в Windows Mobile на C#

Большинство моделей современных телефонов поддерживают функцию виброзвонка, а значит его можно использовать (например в играх при взрывах для придания ещё большей реалистичности, или при написании коммуникационных программ, для того чтобы устройство находясь в кармане дало знать о пришедшем сообщении).

Здесь я приведу три метода реализации виброзвонка на устройствах Windows Mobile в среде .NET CF. Хотя, по правде говоря, все они реализованы через использование API поэтому могут быть использованы не только в .NET.

Итак пример №1 (у меня лично не заработал, предполагаю что должен заработать на Windows Mobile 5.X — у меня просто не на чем проверить)
//Инициирует виброзвонок.
//И сообщает об успехе либо возвращает ошибку.
[DllImport("aygshell.dll")]
private static extern int Vibrate(
            int cvn,
            IntPtr rgvn,
            uint fRepeat,
            uint dwTimeout);

//Останавливает виброзвонок.
//И сообщает об остановке либо об ошибке.
[DllImport("aygshell.dll")]
private static extern int VibrateStop();
        

//Проверяет возможность использования виброзвонка.
[DllImport("aygshell.dll")]
private static extern int VibrateGetDeviceCaps(VibrationCapabilities caps);


//Перечисление используется функцией VibrateGetDeviceCaps для
//определения возможности воспроизведения виброзвонка.
public enum VibrationCapabilities : int
        {
            VDC_Amplitude,
            VDC_Frequency
        }

//Включаем вибратор
public static bool BeginVibrate()
        {
            int result = Vibrate(0, IntPtr.Zero, uint.MaxValue, uint.MaxValue);
            MessageBox.Show(result.ToString());
            if (result != 0)
            { return false; }
            return true;
        }

//Выключае вибратор
public static bool EndVibrate()
        {
            int result = VibrateStop();
            if (result != 0)
            { return false; }
            return true;
        }

У меня этот (первый) вариант не заработал, но во многих источниках приводится, а значит работать должен.

Пример №2 (самый простой)
//Метод простой для Windows Mobile 6.X
//Этим методом издаёт - длинный бзздынь и замолкает.
[DllImport("aygshell.dll", SetLastError = true)]
private static extern uint SndPlaySync(String pszSoundFile, int dwFlags);

//Включаем вибрацию для WinMobile 6.X Метод №1
SndPlaySync("*vibrate*", 0);


Пример №3 (самый мудрёный — но самый эффектный, через индикаторы)
//Метод через индикаторы для 6.X
struct NLED_SETTINGS_INFO
        {
            public uint LedNum;
            public int OffOnBlink;
            public long TotalCycleTime;
            public long OnTime;
            public long OffTime;
            public int MetaCycleOn;
            public int MetaCycleOff;
        };

private const uint NLED_SETTINGS_INFO_ID = 2;

[DllImport("coredll.dll", SetLastError = true)]
private static extern bool NLedSetDevice(uint DeviceInput, ref NLED_SETTINGS_INFO pInput);

// Включаем вибро. Указать номер канала! У каждого устройства он свой
void LedStart(uint id)
        {
            NLED_SETTINGS_INFO settings = new NLED_SETTINGS_INFO();
            settings.LedNum = id;
            settings.OffOnBlink = 1;
            NLedSetDevice(NLED_SETTINGS_INFO_ID, ref settings);
        }

// Выключаем вибро
void LedStop(uint id)
        {
            NLED_SETTINGS_INFO settings = new NLED_SETTINGS_INFO();
            settings.LedNum = id;
            settings.OffOnBlink = 0;
            NLedSetDevice(NLED_SETTINGS_INFO_ID, ref settings);
        }

//Включаем индикатор, ждем onTime миллисекунд, выключаем и ждем offTime миллисекунд.
//Повторяем цикл указанное count количество раз.
void VibrateByLed(uint LeadNum, int onTime, int offTime, int count)
        {
            for (int i = 0; i < count; i++)
            {
                LedStart(LeadNum);
                System.Threading.Thread.Sleep(onTime);
                LedStop(LeadNum);
                System.Threading.Thread.Sleep(offTime);
            }
        }


......

// 1 - номер индикатора для "вибро" на моем устройстве.
VibrateByLed(1, 100, 150, 5); // лучше стартовать в отдельном потоке.


Вот собственно и всё.

Скачать пример исходников можно здесь: VibrateMobile.rar

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.