2009-02-25 7 views
4

Ich schreibe eine Software, die automatisch ein Bluetooth-Gerät mit dem Windows Bluetooth API verbindet. Wenn es eine Verbindung, Windows automatisch startet die Bluetooth-HID-Gerätetreiber zu installieren, wie erwartet:Windows-API: Erkennen, wenn eine Treiberinstallation beendet ist

Installing Bluetooth HID drivers

Diese ca. 10-15 Sekunden dauert, woraufhin zeigt Windows die familar „gebrauchsfertig“ Nachricht:

Hardware installed and ready for use

das Problem ist, dass BluetoothSetServiceState() kehrt, sobald der Fahrer beginnt zu installieren, nicht, wenn das Gerät für den Einsatz tatsächlich bereit ist. Dies verursacht einige Probleme für meinen Code, da er eine separate Bibliothek für die Gerätekommunikation aufruft, sobald sie "verbunden" ist. Die ersten paar Aufrufe schlagen fehl, weil die Treiber die Installation noch nicht abgeschlossen haben und diese Verbindungsversuche die Treiberinstallation stören. Wenn ich versuche, die Kommunikationsbibliothek zu verwenden, bevor die Treiberinstallation beendet ist, möchte Windows neu starten, bevor das Gerät kann verwendet werden.

Ich suche nach einer Möglichkeit, dieses "ready-to-use" -Ereignis anzuhängen, wenn die Treiberinstallation tatsächlich beendet ist, so dass ich meine Kommunikationsbibliotheksaufrufe nicht vorzeitig mache. Gibt es einen Windows-API-Aufruf, den ich verwenden kann, um entweder einen Funktionsrückruf zu registrieren oder den Status der Treiberinstallation direkt abzurufen?

Ich schreibe dies in Vanille C/C++, keine. NET. Danke für Ihre Hilfe!

+0

Haben Sie WM_DEVICECHANGE und/oder RegisterDeviceNotification versucht? – Ismael

Antwort

4

Sie möchten vielleicht sehen this sample code und RegisterDeviceNotification Funktion. Ich bin nicht sicher für 100%, aber es scheint zu funktionieren, wenn Sie die richtige GUID für Ihre Geräteklasse angeben.

+0

Ich habe gerade diese Methode versucht und es funktioniert einwandfrei. – Thomas

0

Wenn es ein Netzwerk bindend sendet dann RNDIS eine Nachricht, wenn es Installation gemäß RNDIS Driver Implemenation guide und Definition von RNDIS

oder

Sie installieren können ergänzt oder die Geräteliste abfragen programmatisch durch Devcon-Dienstprogramm (Quelle wie angegeben Code ist mit MSDN verfügbar) in Examples

2

Hier ist das, was ich tun würde:

  1. Herunterladen Winspector (oder Spy ++ verwenden)
  2. Winspector Inbetriebnahme und begin watching for Window Messages
  3. Installieren des Treiber
  4. Uhr für Indicatives WM einer abgeschlossenen Treiberinstallation

Ich wünsche ich mehr beschreibend sein könnte auf # 4, aber ich bin nicht vertraut mit der spezifischen Fenstermeldung, die Sie brauchen. Have a look here for possible Window Messages to expect.

Sobald Sie jedoch die richtige Fenstermeldung ermittelt haben, warten Sie programmgesteuert auf dieses WM. CodeProject has an excellent write up on how to do this in C++. Persönlich, I'd prefer to do it in Delphi.