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

Signaler
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014
-
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014
-
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

3 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Salut, as tu essayé avec le message Windows WM_DEVICECHANGE, tu as une source ici :

http://www.csharpfr.com/codes/USB-DETECTOR_36407.aspx
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
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...
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

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