Exécuter un programme quand on connecte un disque

Résolu
vautour32 Messages postés 38 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 9 décembre 2008 - 26 nov. 2007 à 18:34
vautour32 Messages postés 38 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 9 décembre 2008 - 27 nov. 2007 à 19:06
Bonjour à tous,
Je voudrais créer un programme qui s'exécute quand un disque amovible est connecté à l'ordinateur.
Je connais l'événement DeviceArrival des contrôles sysinfo.  Seulement, mon programme est sans interface, et ne s'exécute donc que très peu de temps, de sorte qu'il ne peut pas attendre que l'événement se produise.
SVP aidez-moi
Merci d'avance
Vautour32

4 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
26 nov. 2007 à 20:03
Bonsoir,

Dur dur... car nous allons parler de tout sauf de VB...
Je vais essayer de le faire par clichés successifs (et même le choix de l'ordre des clichés va être difficile) :

Cliché 1 : L'évènement DeviceArrival concerne le disque inséré.
Cliché 2 : on ne sait qu'un disque a été inséré que lorsque, la vitesse de rotation nécessaore ayant été atteinte (et ça prend du temps) il commence à être lisible.
Cliché 3 : tous les lecteurs installés (de disquettes, de CD ou de DVD) figurent du seul fait de leur installation, dans la liste des volumes présents, qu'ils contiennent ou non un support.
Cliché 4 : seuls les lecteurs externes, branchables par USB par exemple, sont absents jusqu'à leur branchement et pourraient donc se faire "dénoncer" lors q'un branchement.
Ayé ? Imprégné ?
On y va donc :
- Sysinfo ne te permet rien tant que le supposé disque n'est pas lu
- un timer espion des volumes présents ne te servirait que dans le cas d'un ajout de device (sur USB, par exemple)
- jouer avec la fermeture et l'ouverture (état) d'un lecteur serait vain (va donc savoir si une ouverture puis une fermeture a été faite avec ou sans insertion d'un support, sans, précisément, attendre de pouvoir lire le support ?)

Tu vois ? (ce n'est qu'une infime partie).

Conclusion : A moins que WMI (je n'ai pas cherché de ce côté) ne permette de déceler l'état matériel d'un device (pour ceux déjà installés), tu seras totalement incapable de t'en sortir... Et comme WMI risque par ailleurs de ne pas fonctionner toujours de la même manière (être exploitable).... rien ne tiendra en cas de volonté de distribuer ton appli....

Je te conseille donc de changer de philosophie, si tout celà a finalement un but (que l'on ne connait pas encore) atteignable par d'autres contrôles...

Désolé d'avoir été un peu long...
3
vautour32 Messages postés 38 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 9 décembre 2008
26 nov. 2007 à 20:20
Merci beaucoup pour toutes ces précisions.  Je ne mets par "réponse acceptée" au cas où qq'un d'autre aurait une "illumination".
Que dirais-tu de cela?

Function Disqueajouté() As Drive
Static disques() As String
Dim i As Integer
Dim fso As FileSystemObject, drv As Drive
Set fso = CreateObject("scripting.filesystemobject")
If fso.Drives.Count > ubound(nbdisques) Then
    ReDim Preserve disques(fso.Drives.Count)
    For Each drv In fso.Drives
        i = i + 1
        If disques(i) <> drv.DriveLetter Then Set Disqueajouté = drv
        disques(i) = drv.DriveLetter
    Next
End If
End Function

   
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
26 nov. 2007 à 20:39
Non !

Je t'ai déjà exposé que le compte des volumes présents incluait systématiquement les lecteurs installés (vide ou non)...
0
vautour32 Messages postés 38 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 9 décembre 2008
27 nov. 2007 à 19:06
Effectivement.  Désolé, j'étais un peu fatigué.  Il manquait tout ce que j'ai mis en rouge.
Maintenant ça marche. Merci pour tout.

Function Disqueajouté() As Drive
Static disques() As String
Dim i As Integer
Dim fso As FileSystemObject, drv As Drive
Set fso = CreateObject("scripting.filesystemobject")
If DrivesCount > UBound(disques) Then
    ReDim Preserve disques(DrivesCount)
    For Each drv In fso.Drives
        If drv.IsReady Then
            i = i + 1
            If disques(i) <> drv.DriveLetter Then Set Disqueajouté = drv
            disques(i) = drv.DriveLetter
        End If
    Next
End If
End Function

Function DrivesCount() As Integer
Dim i As Integer
Dim fso As FileSystemObject, drv As Drive
Set fso = CreateObject("scripting.filesystemobject")
For Each drv In fso.Drives
    If drv.IsReady Then i = i + 1
Next
DrivesCount = i
End Function
0
Rejoignez-nous