2010-03-10 4 views
5

J'utilise actuellement WM_DEVICECHANGE pour être averti lorsque de nouveaux lecteurs USB sont connectés à l'ordinateur. Cela fonctionne très bien pour les périphériques tels que les clés USB où, dès que l'appareil arrive, il est prêt à lire des fichiers. Pour les appareils comme les lecteurs de cartes SD, ce n'est pas le cas parce que le message est envoyé une fois lorsque l'appareil est connecté mais aucun message n'est envoyé lorsqu'un utilisateur insère réellement une carte dans l'appareil.Détecter l'insertion d'un support dans un lecteur à l'aide de messages Windows

Est-il possible de détecter l'insertion de nouveaux médias dans un périphérique USB existant sans avoir à utiliser l'interrogation?

+0

Cochez cette question http://stackoverflow.com/questions/583593/how-can-i-detect-when-an-sd-card-is-plugged-in –

+2

@Kirill: il y a une bonne raison à cette question pas de réponses acceptées. Ils ne parviennent pas à distinguer entre "nouveau lecteur" et "insérer du volume dans le lecteur existant". – MSalters

Répondre

8

Je viens de le faire il y a quelques semaines. Techniquement parlant, la route RegisterDeviceNotification est la bonne voie à suivre, mais elle nécessite une bonne quantité de travail pour bien faire. Cependant, Windows Explorer fait déjà tout le travail pour vous. Utilisez simplement SHChangeNotifyRegister avec SHCNE_DRIVEADD/SHCNE_DRIVEREMOVED/SHCNE_MEDIAINSERTED/SHCNE_MEDIAREMOVED. Notez que cette méthode dépend du service Shell Hardware Detection (ou de ce que l'on appelle), mais c'est beaucoup plus facile que d'essayer de réimplémenter la fonctionnalité vous-même.

+0

Bon appel. La bibliothèque qui implémente cela est présente sur tous les systèmes. Mais le paramètre de registre DisableAutorunDriveType affecte-t-il cela? –

+0

Je n'ai pas testé cela, mais je ne pense pas que les deux sont connectés. Ce mécanisme est utilisé par l'application "Remove Hardware Safely"; Même si l'exécution automatique est désactivée, cette application doit toujours recevoir des notifications d'arrivée/de suppression. – Luke

+3

Le message SHCNE_MEDIAINSERTED est envoyé même si le paramètre de registre DriveTypeAutoRun est défini pour désactiver tous les périphériques. – rjschnorenberg

0

Peut être un bug dans le pilote du lecteur SD. La description dans WM_DEVICECHANGE est "DBT_DEVICEARRIVAL 0x8000 Un périphérique ou un média a été inséré et est maintenant disponible." Par conséquent, vous êtes censé recevoir une notification pour l'insertion de média.

Avez-vous essayé d'utiliser RegisterDeviceNotification? Seules certaines notifications sont envoyées par défaut et le changement de support n'est peut-être pas l'un d'entre eux.

+0

En l'occurrence, les nouvelles notifications de volume sont envoyées par défaut. – MSalters

+0

À droite, mais la lettre de lecteur (volume) est attribuée lorsqu'un lecteur de carte est inséré.La notification de modification de support peut nécessiter RegisterDeviceNotification. –

0

Peut-être que c'est un bug dans les pilotes de périphériques (je le pense certainement), mais ils semblent tous fonctionner de la même manière ... PAS. Donc, à ce stade, je ne pense pas que vous pouvez obtenir n'importe quel développeur de périphériques pour changer leurs caractéristiques même si Microsoft (probablement le plus grand développeur) vous laisse croire qu'il devrait fonctionner de cette façon (Ne fonctionne pas pour mon pilote Microsoft Windows7). L'insertion d'une carte SD dans un périphérique USB ne déclenche tout simplement pas un message WM_DEVICECHANGE.

Utilisez SHChangeNotifyRegister pour les périphériques de type média. Il ne nécessite pas de registre de devicenotification. Et vous pouvez obtenir la lettre de lecteur via SHGetPathFromIDList. Utilisez SHCNE_MEDIAINSERTED et SHCNE_MEDIAREMOVED.

Utilisez le périphérique ONDeviceNotify si vous recherchez un périphérique matériel plutôt qu'un périphérique multimédia, ou si vous êtes en mesure d'écrire un pilote de périphérique personnel.

Voir ce commentaire Code de CodeProject - Trapping windows messages

2

Il y a un très bon exemple de l'utilisation de SHChangeNotifyRegister dans le « Change Notifier Sample Watcher ». télécharger depuis cette adresse:

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

Je SHChangeNotifyRegister mis en œuvre dans mon code Qt.

Merci à Luke pour sa très bonne réponse!

+0

Je suis assez nouveau - quand il s'agit de mélanger et d'implémenter du code Windows (comme SHChangeNotifyRegister) avec du code Qt. Pouvez-vous me donner quelques conseils sur la façon de procéder? Toute aide est appréciée !! – zeFree

Questions connexes