2009-02-25 2 views
4

Я пишу некоторое программное обеспечение, которое автоматически соединяет устройство Bluetooth с помощью Windows Bluetooth API. Когда он подключается, Windows автоматически запускает установку драйвера Bluetooth HID устройства, как и ожидалось:Windows API: обнаружение при завершении установки драйвера

Installing Bluetooth HID drivers

Это занимает около 10-15 секунд, после чего для Windows отображает на «готовое знакомые для использования» сообщение:

Hardware installed and ready for use

проблема заключается в том, что BluetoothSetServiceState() возвращается, как только водитель установки начинает, не тогда, когда устройство фактически готово к использованию. Это вызывает некоторые проблемы для моего кода, потому что он вызывает отдельную библиотеку для связи с устройством, как только она «подключена». Первые несколько вызовов терпят неудачу, потому что драйверы не завершили установку, и попытки этих попыток мешают установке драйвера, потому что, если я попытаюсь использовать библиотеку связи до завершения установки драйвера, Windows хочет перезапустить, прежде чем устройство сможет использоваться.

Что я ищу, это способ подключить этот «готовый к использованию» случай, когда установка драйвера действительно завершена, поэтому я не делаю свои вызовы в библиотеке сообщений преждевременно. Есть ли какой-либо вызов Windows API, который я могу использовать для регистрации функции обратного вызова или прямого опроса состояния установки драйвера?

Я пишу это в ванильном C/C++, не .NET. Спасибо за вашу помощь!

+0

Вы пробовали WM_DEVICECHANGE и/или RegisterDeviceNotification? – Ismael

ответ

4

Возможно, вы захотите взглянуть на this sample code и RegisterDeviceNotification функция. Я не уверен на 100%, но, похоже, это работает, если вы укажете правильный guid для вашего класса устройства.

+0

Я просто попробовал этот метод, и он работает безупречно. – Thomas

0

Если сеть связывания затем RNDIS посылает сообщение, когда он завершает установку в соответствии с RNDIS Driver Implemenation guide и определение RNDIS

или

Вы можете установить или запросить список устройств программно через утилиту Devcon (источник код доступен с MSDN), как указано в Examples

2

Вот что я хотел бы сделать:

  1. Скачать Winspector (или использовать Spy ++)
  2. Запуск Winspector и begin watching for Window Messages
  3. Установите драйвер
  4. Часы для индикативного WM в заполненного установки драйвера

Я хотел бы быть более описательный на # 4, но я не знаком с конкретным сообщением окна, которое вам нужно. Have a look here for possible Window Messages to expect.

Однако, как только вы определите правильное оконное сообщение для поиска, тогда программным способом ваша программа ждет (и обрабатывает) этот WM. CodeProject has an excellent write up on how to do this in C++. Лично I'd prefer to do it in Delphi.