Détection USB, Timer ou Evènements ? [Résolu]

Moomoon07
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Dernière intervention
5 mai 2014
- 13 nov. 2006 à 10:21 - Dernière réponse : Moomoon07
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Dernière intervention
5 mai 2014
- 13 nov. 2006 à 11:51
Salut !

J'aurais besoin d'un petit coup de main.
Je souhaiterais afficher dans un datagridView la liste des clefs USB, dont le nom de volume est AMIDISK, branchées : Sur une 1ère colonne, les lettres de lecteurs, et sur une 2ème, un numéro de clef USB écrit dans un fichier.txt contenu à la racine de la clef.
Bien évidemment, je souhaiterais que ce tableau reste le plus possible à jour.

J'ai essayé 2 solutions :

- La première utilise une source du forum :
        ManagementEventWatcher w;
        public void StartListen()
        {
            WqlEventQuery q = new WqlEventQuery();
            q.EventClassName = "__InstanceOperationEvent";
            q.WithinInterval = new TimeSpan(0, 0, 3);
            q.Condition = @"TargetInstance ISA 'Win32_USBControllerDevice' ";
            w = new ManagementEventWatcher(q);
            w.EventArrived += new EventArrivedEventHandler(this.UsbEventArrived);
            w.Start();
        }
        public void StopListen()
        {
            w.Stop();
        }
        private void UsbEventArrived(object sender, EventArrivedEventArgs e)
        {
            //Thread.Sleep(5000);
            ActualiserLecteursBranches();
        }
Avec cette solution, l'évènement fonctionne et lance ActualiserLecteursBranches().
Seulement il semble que l'évènement se passe sur le branchement de la clef, et non sur la détection de la clef par le pc. Donc l'actualisation se fait avant la détection de la clef.
J'ai donc essayé de mettre un sleep, mais c'est bizarre, ca ne marche pas mieux.

- La 2ème consiste à actualiser les lecteur toutes les x secondes :
        private System.Windows.Forms.Timer _timerLabel;
        public System.Windows.Forms.Timer timerLabel
        {
            get
            {
                if (_timerLabel == null)
                {
                    _timerLabel = new System.Windows.Forms.Timer();
                    _timerLabel.Interval = 3000;
                    _timerLabel.Tick += new EventHandler(timerLabel_Tick);
                }
                return _timerLabel;
            }
            set { _timerLabel = value; }
        }
        void timerLabel_Tick(object sender, EventArgs e)
        {
            ActualiserLecteursBranches();
        }
Celle ci marche mais me semble être du bidouillage.

Voici mon actualisation :
     private void ActualiserLecteursBranches()
        {
            DataLecteursBranche.Rows.Clear();
            foreach (System.IO.DriveInfo D in System.IO.DriveInfo.GetDrives())
            {
                string NumLecteur="";
                try
                {
                    if (D.VolumeLabel.ToString().CompareTo("AMIDISK") == 0)
                    {
                        FileStream FS = new FileStream(D.Name.ToString() + @"\Num.txt", FileMode.Open);
                        StreamReader SR = new StreamReader(FS);
                        NumLecteur = SR.ReadLine();
                        FS.Close(); SR.Close();
                        DataLecteursBranche.Rows.Add(D.Name.ToString(), NumLecteur);
                    }
                }
                catch { }
            }
            this.Refresh();
        }

Que me conseillez vous ?

MMN
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Lutinore
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
- 13 nov. 2006 à 11:10
3
Merci
Salut, as tu essayé avec le message Windows WM_DEVICECHANGE, tu as une source ici :

http://www.csharpfr.com/codes/USB-DETECTOR_36407.aspx

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de Lutinore
leprov
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
- 13 nov. 2006 à 11:10
0
Merci
tu peux utiliser l'API, une simple recherche sur le site taurais donné la solution....tu as des messages windows pour insertion de clé, retirage de clé, etc...
Commenter la réponse de leprov
Moomoon07
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Dernière intervention
5 mai 2014
- 13 nov. 2006 à 11:51
0
Merci
Bon ça marche avec les messages windows.
Je ne met pas mon code puisque j'ai utilisé la source à 99%.
leprov > Mais ne dit pas que j'ai pas cherché ! Si je n'avais pas cherché, je n'aurais pas trouvé la source que j'ai utilisé pour ma première idée. Si cette source n'est pas censée marcher, je vois pas ce qu'elle fait sur le forum, et si elle est censée marcher, je vois pas pourquoi j'utiliserais les API.
Utilisés de cette manière, les API c'est pour moi du bidouillage.

MMN
Commenter la réponse de Moomoon07

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.