Détection USB, Timer ou Evènements ?

Résolu
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014 - 13 nov. 2006 à 10:21
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre 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

3 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
13 nov. 2006 à 11:10
Salut, as tu essayé avec le message Windows WM_DEVICECHANGE, tu as une source ici :

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