"My cat, as it turns out, is an excellent debugger, and she has helped me solve a number of nasty bugs when I talked to her about them."
John Robbins, Debugging Applications, Microsoft Press, 2000
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */

Менеджер Bluetooth

Статья-оригинал

Как известно, постоянно включенный Bluetooth изрядно уменьшает время жизни телефона. В стандартной поставке Windows Mobile отсутствует удобный способ включать и выключать bluetooth, а по дороге на работу так хочется легко и просто включить его, чтобы получить возможность разговаривать через гарнитуру! Важная особенность — для этого переключения очень не хочется, чтобы было необходимо смотреть на экран.

Я решил разработать удобное приложение, которое при старте переключает состояние bluetooth, после чего ждет одну минуту и автоматически выгружается из памяти. Таким образом, достаточно назначить вызов приложения на одну из аппаратных кнопок и получить желаемый результат.


Всегда любил, чтобы мои приложения хотя бы немного радовали глаз. Именно поэтому в верхней части приложения можно наблюдать логотип bluetooth. Он цветной, когда bluetooth активен, и серый, когда bluetooth выключен.

Я добавил текстовое поле с отображением нескольких строк для журнализации. Также помимо основной задачи переключать состояние bluetooth при старте приложения, я добавил две кнопки для явного переключения состояния уже после старта.

Для работы с Bluetooth воспользуемся P/Invoke для работы с Bluetooth:

[DllImport("BthUtil.dll")]
private static extern int BthGetMode(out RadioMode dwMode);

[DllImport("BthUtil.dll")]
private static extern int BthSetMode(RadioMode dwMode);


* This source code was highlighted with Source Code Highlighter.

Кроме этого, я также воспользовался брокером состояний и уведомлений (SNAPI). Суть в том, что если состояние bluetooth будет изменяться за пределами нашего приложения, без SNAPI мы об этом не узнаем. Можно подписаться практически на любые уведомления. Мы же подпишемся только на bluetooth:

SystemState bluetoothStatePowerOn = new SystemState(SystemProperty.BluetoothStatePowerOn);
bluetoothStatePowerOn.Changed += new ChangeEventHandler(bluetoothStatePowerOn_Changed);

void bluetoothStatePowerOn_Changed(object sender, ChangeEventArgs args)
{
UpdateScreen();
}


* This source code was highlighted with Source Code Highlighter.

Напоследок нам необходимо разобраться с автоматическим завершением приложения. Всё очень просто — есть таймер, который ждёт минуту, после чего выполняется цикл, на каждой итерации которого вызывается Thread.Sleep(1000). Это создает отличный эффект, когда идет завершение программы "Auto shutdown in <кол-во> seconds" и позволяет пользователю понять, что приложение не закрылось аварийно.

Исходный код на С#: BluetoothManager.zip

Перевод: Андрей Коновалов

Реклама