2010-03-10 8 views
5

Ich verwende derzeit WM_DEVICECHANGE, um benachrichtigt zu werden, wenn neue USB-Laufwerke an den Computer angeschlossen sind. Dies funktioniert hervorragend für Geräte wie Thumb-Drives, wo es, sobald das Gerät ankommt, bereit ist, Dateien von ihm lesen zu lassen. Für Geräte wie SD-Kartenleser ist dies nicht der Fall, da die Nachricht einmal gesendet wird, wenn das Gerät verbunden ist, aber keine Nachricht gesendet wird, wenn ein Benutzer tatsächlich eine Karte in das Gerät einlegt.Ermitteln des Einlegens von Medien in ein Laufwerk mithilfe von Windows-Nachrichten

Ist es möglich, das Einfügen neuer Medien in ein vorhandenes USB-Gerät zu erkennen, ohne das Polling verwenden zu müssen?

+0

Überprüfen Sie diese Frage http://stackoverflow.com/questions/583593/how-can-i-detect-when-an-sd-card-is-plugged-in –

+2

@Kirill: Es gibt einen guten Grund, dass Frage hat keine akzeptierten Antworten. Sie unterscheiden nicht zwischen "neues Laufwerk" und "Volume in bestehendes Laufwerk einfügen". – MSalters

Antwort

8

Ich habe das gerade vor ein paar Wochen gemacht. Technisch gesehen ist die RegisterDeviceNotification Route der richtige Weg, aber es erfordert eine ordentliche Menge an Arbeit, um richtig zu machen. Der Windows Explorer erledigt jedoch bereits die ganze Arbeit für Sie. Verwenden Sie einfach SHChangeNotifyRegister mit SHCNE_DRIVEADD/SHCNE_DRIVEREMOVED/SHCNE_MEDIAINSERTED/SHCNE_MEDIAREMOVED. Beachten Sie, dass diese Methode vom Shell Hardware Detection-Dienst (oder wie auch immer es genannt wird) abhängt, aber es ist viel einfacher als der Versuch, die Funktionalität selbst erneut zu implementieren.

+0

Guter Anruf. Die Bibliothek, die das implementiert, ist auf jedem System vorhanden. Aber beeinflusst die DisableAutorunDriveType-Registrierungseinstellung das? –

+0

Ich habe das nicht getestet, aber ich würde nicht denken, dass die beiden verbunden sind. Dieser Mechanismus wird von der Tray-App "Hardware sicher entfernen" verwendet. Selbst wenn Autorun deaktiviert ist, muss diese Tray-App weiterhin Benachrichtigungen über Ankunft/Entfernung erhalten. – Luke

+3

Die Nachricht SHCNE_MEDIAINSERTED wird gesendet, auch wenn die Registrierungseinstellung DriveTypeAutoRun so eingestellt ist, dass alle Geräte deaktiviert werden. – rjschnorenberg

0

Könnte ein Fehler im SD-Reader-Treiber sein. Die Beschreibung in WM_DEVICECHANGE ist "DBT_DEVICEARRIVAL 0x8000 Ein Gerät oder ein Medium wurde eingefügt und ist nun verfügbar."

Daher sollten Sie eine Benachrichtigung für die Medieneinfügung erhalten.

Haben Sie versucht, RegisterDeviceNotification zu verwenden? Standardmäßig werden nur einige Benachrichtigungen gesendet, und die Medienänderung gehört möglicherweise nicht dazu.

+0

Wie es passiert, werden neue Volume-Benachrichtigungen standardmäßig gesendet. – MSalters

+0

Richtig, aber der Laufwerksbuchstabe (Volume) wird zugewiesen, wenn ein Kartenleser eingesteckt wird.Die Medienänderungsbenachrichtigung erfordert möglicherweise RegisterDeviceNotification. –

0

Vielleicht ist es ein Fehler in den Gerätetreibern (ich denke es ist sicher), aber sie scheinen alle auf die gleiche Weise zu funktionieren ... NICHT. An diesem Punkt glaube ich nicht, dass Sie Geräteentwickler dazu bringen können, ihre Geräteeigenschaften zu ändern, selbst wenn Microsoft (wahrscheinlich der größte Entwickler) Sie glauben macht, dass es so funktionieren sollte (funktioniert nicht für meinen Windows7-Microsoft-Treiber). Das Einlegen einer SD-Karte in ein USB-Gerät löst einfach keine WM_DEVICECHANGE-Nachricht aus.

Verwenden Sie SHChangeNotifyRegister für Medientypgeräte. Es ist keine Registrierung erforderlich. Und Sie können den Laufwerksbuchstaben über SHGetPathFromIDList abrufen. Verwenden Sie SHCNE_MEDIAINSERTED und SHCNE_MEDIAREMOVED.

Verwenden Sie das Gerät ONDeviceNotify, wenn Sie nach einem Hardwaregerät statt einem Mediengerät suchen, oder Sie können möglicherweise einen eigenen Gerätetreiber schreiben.

dieser Kommentars angezeigten Code CodeProject - Trapping windows messages

2

Es ist ein sehr gutes Beispiel für die Verwendung von SHChangeNotifyRegister im „Change Watcher Probe Notify“. Laden Sie es von dieser Adresse:

http://msdn.microsoft.com/en-us/library/dd940348.aspx#downloading

ich SHChangeNotifyRegister in meinem Qt-Code implementiert.

Danke an Luke für seine sehr gute Antwort!

+0

Ich bin ziemlich neu - wenn es darum geht, Windows-Code (wie SHChangeNotifyRegister) mit Qt-Code zu mischen und zu implementieren. Können Sie mir eine Anleitung geben, wie Sie damit weitermachen? Jede Hilfe wird geschätzt !! – zeFree