Moomoon07
Messages postés223Date d'inscriptionmercredi 31 mai 2006StatutMembreDernière intervention 5 mai 2014
-
13 nov. 2006 à 10:21
Moomoon07
Messages postés223Date d'inscriptionmercredi 31 mai 2006StatutMembreDerniè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();
}
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 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...
Moomoon07
Messages postés223Date d'inscriptionmercredi 31 mai 2006StatutMembreDerniè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.