Bonjour à tous ,
Connaîtriez vous un moyen de déconnecter proprement un périphérique
USB, par code ?
Merci
Bonjour à tous ,
Connaîtriez vous un moyen de déconnecter proprement un périphérique
USB, par code ?
Merci
Bonjour,
J'ai bien trouvé l'utilitaire microsoft devcon,
http://support.microsoft.com/kb/311272/fr.
mais je me retrouve toujours avec un message de ce type
"suppression de périphérique hasardeuse....."
Peux être avez vous une autre idée ?
A+
Google.fr est ton ami :
http://www.developpez.net/forums/showthread.php?t=53391
Ce code devrait te mettre sur la piste :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 unit USB_D; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type PDEV_BROADCAST_HDR = ^TDEV_BROADCAST_HDR; TDEV_BROADCAST_HDR = packed record dbch_size : DWORD; dbch_devicetype : DWORD; dbch_reserved : DWORD; end; PDEV_BROADCAST_VOLUME = ^TDEV_BROADCAST_VOLUME; TDEV_BROADCAST_VOLUME = packed record dbcv_size : DWORD; dbcv_devicetype : DWORD; dbcv_reserved : DWORD; dbcv_unitmask : DWORD; dbcv_flags : WORD; end; type TForm1 = class(TForm) Memo1: TMemo; private { Déclarations privées } procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE; public { Déclarations publiques } end; var Form1: TForm1; GetLettre : string; implementation {$R *.dfm} ///\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ // // Detecter la Connection/Déconnection de périphériques USB de stockage "STORAGE" // Mém FLASH, HDD , Mém app photo , MP3... // // Rylou 27/01/2005 21:44 // ///\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ // Capture Evenement windows "WMDeviceChange" procedure TForm1.WMDeviceChange(var Msg: TMessage); var VolName, FileSysName : Array[0..Max_Path]Of Char; VolSerial, FileMaxLen, FileFlags : DWord; S : string; begin //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ // TESTER si DBT_DEVICEARRIVAL = $8000 // si oui, ne traiter que les périphériques de stockage de type 0=DeviceTypeOEM //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ if Msg.wParam =$8000 then begin if PDEV_BROADCAST_HDR( Msg.LParam )^.dbch_devicetype <>2 then exit; if PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_flags <>0 then exit; // A partir d'ici vous pouvez mettre votre code a executer en cas // de connection d'un peripherique de stockage USB. // Vous pouvez aussi par exemple comparer le "Non de volume" // de ce péripphérique pour affiner le declenchement. //Affiche dans le textbox les infos du periphérique connécté (pour l'exemple) S := 'Connection du périphérique !' +#13+#10+#13+#10; // Sa lettre "DeviceID" str(ln(PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_unitmask)/ln(2)+Ord('A'):2:0,GetLettre); S := S + 'DeviceID :'+#9+#9+ char(strtoint(GetLettre)) + ':\' + #13+#10; // NomVolume + SySfichier + N° serie du periphérique If GetVolumeInformation(pchar(char(strtoint(GetLettre))+':\'),VolName,Max_Path,@VolSerial, FileMaxLen, FileFlags,FileSysName,Max_Path) Then S := S +'Nom du Volume :' +#9+#9+ VolName +#13+#10'Système de fichiers :' +#9+ FileSysName +#13+#10'Numéro de série :' +#9+#9+ IntToStr(VolSerial)+#13+#10; // Taille et free espace du periphérique S := S + 'Taille totale :' +#9+#9+ FloatToStrF(DiskSize(strtoint(GetLettre)-64)div 1024, ffNumber, 18, 0) + ' Kilo-octets' + #13+#10; S := S + 'Disponible :' +#9+#9+ FloatToStrF(DiskFree(strtoint(GetLettre)-64) div 1024, ffNumber, 18, 0) + ' Kilo-octets'; memo1.text:=S; beep; // Envoi un beep sonore a la connection end; // Fin de traitement "connection periphérique" //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ // TESTER si DBT_DEVICEREMOVECOMPLETE = $8004 // si oui, ne traiter que les périphériques de stockage de type 0=DeviceTypeOEM //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ if Msg.wParam =$8004 then begin if PDEV_BROADCAST_HDR( Msg.LParam )^.dbch_devicetype <>2 then exit; if PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_flags <>0 then exit; // A partir d'ici vous pouvez mettre votre code a executer en cas // de déconnection d'un peripherique de stockage USB. // Affiche dans le textbox le periphérique déconnécté (pour l'exemple) S := 'Déconnection du périphérique !' +#13+#10+#13+#10; // Sa lettre "DeviceID" str(ln(PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_unitmask)/ln(2)+Ord('A'):2:0,GetLettre); S := S + 'DeviceID :' +#9+#9+ char(strtoint(GetLettre)) + ':\' + #13+#10; memo1.text:=S; beep; // Envoi un beep sonore a la déconnection end; // Fin de traitement "déconnection periphérique" end; end.
Pour ajouter une image sur ton message, celle-ci doit se trouver sur internet (une url), ou alors utilise "gérer les pièces jointes" pour l'ajouter...Envoyé par pitango
Bonjour Sub0,
Ok je te remercie, c'est corrigé.Envoyé par sub0
Pour le code que tu m'a envoyé, il est surtout utile pour détecter les changements états, mais sauf erreur de ma part, pas pour "éteindre le périphérique", comme une déconnexion manuelle le ferait.
Il y a d'ailleurs sur le sujet un post très intéressant
http://www.developpez.net/forums/sho...&highlight=usb
Pour revenir à la déconnection, je viens de me rendre compte de mes clients seront W2003 où le problème ne se pose pas.
Merci pour en tout cas pour la piste.
Je cherche encore un peu, pour la gestion éventuellement des poste en W2000.
A+
Effectivement, mais l'idée est déjà de savoir quels sont les ports usb où il ya un périphérique connecté et surtout connaître exactement quel est le port que tu souhaites désactivés.
Pour reste, je pense qu'il suffira de poster le message Windows correspondant à la déconnexion du périphérique. Il s'agit théoriquement du même message qui est généré par Windows lorsqu'on désactive le périphérique manuellement. Le code donné plus haut te permettra donc de savoir quel format de message il faudra pour commander cette déconnexion. Il te permettra aussi de vérifier que celle-ci a bien fonctionné...
OK merci Sub0, pour ton aide.
Je vais faire dès que j'ai le temps de recherches sur ce message windows.
A+
Et bien il suffit de lancer la démo que je t'ai donné et d'afficher le message correspondant au périphérique que tu déconnectes. Dans la procédure qui détecte l'evènement WMDeviceChange, affiche dans un memo par exemple, les paramètres du message qui est traîté. Il est du type TMessage...
Finalement, tu te rendras compte qu'il est de toutes façons nécessaire de connaître le port du périphérique que tu souhaites déconnecter avant de pouvoir le faire car d'un pc à l'autre, il se peut qu'il ne soit pas le même. Il faudra donc, au départ, obtenir la liste des périphériques connectés pour connaître le port à traîter, et enfin tu pourras générer le message de déconnexion.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager