Включение виброзвонка в 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); // лучше стартовать в отдельном потоке.
Вот собственно и всё.