Bonsoir,

Une idée m'est venue à l'esprit, c'est de faire un composant qui me permettrait de récupérer un peu tout ce dont j'ai besoin lorsqu'une clé USB est insérer.

Pour celà, j'avais vu sur ce forum un morceau de code qui permettait de détecter l'insertion ou le retrait de clé usb, CDROM ...

Sans utiliser le composant, j'arrive à récupérer correctement mes informations par contre, je n'y arrive pas en passant par ce dernier ...

Voici mon code :

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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
unit UMedia;
 
interface
 
uses Windows,Messages,Classes,SysUtils,Dialogs;
 
const
  DBT_DEVICEARRIVAL          = $8000;          // system detected a new device
  DBT_DEVICEREMOVECOMPLETE   = $8004;          // device is gone
  DBT_DEVTYP_VOLUME          = $00000002;      // device volume class
 
 
type
  PDevBroadcastHdr  = ^DEV_BROADCAST_HDR;
  PDevBroadcastHeader  = PDevBroadcastHdr;
  DEV_BROADCAST_HDR = packed record
    dbch_size: DWORD;
    dbch_devicetype: DWORD;
    dbch_reserved: DWORD;
end;
 
  PDevBroadcastVolume        =  ^DEV_BROADCAST_VOLUME;
  DEV_BROADCAST_VOLUME      =  packed record
     dbch_size:              DWORD;
     dbch_devicetype:        DWORD;
     dbch_reserved:          DWORD;
     dbcv_unitmask:          DWORD;
     dbcv_flags:             WORD;
end;
 
type TMediaConnected = class(TComponent)
  private
    LettreLecteur:char;
    VolName     : Array[0..Max_Path]Of Char;
    FileSysName : Array[0..Max_Path]Of Char;
    VolSerial   : DWord;
    FileMaxLen  : DWord;
    FileFlags   : DWord;
    EspaceLibre : double;
    EspaceTotal : double;
    EspaceOccupe: double;
    procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
  public
    function GetSerialVolume:Cardinal;
    function GetNameVolume:String;
    function GetFreeSpace(TypeSizeReturn:String='octet'):double;
    function GetBusySpace(TypeSizeReturn:String='octet'):double;
    function GetSpace(TypeSizeReturn:String='octet'):double;
    function GetLetterMedia:char;
 
end;
 procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('Media',[TMediaConnected]);
end;
 
procedure TMediaConnected.WMDeviceChange(var Msg: TMessage);
var
PHeader : PDevBroadcastHeader;
PData : PDevBroadcastVolume;
Index : Integer;
 
begin
inherited;
  PHeader:=PDevBroadcastHeader(Msg.lParam);
  LettreLecteur:=#0;
  case Msg.WParam of
    DBT_DEVICEARRIVAL :
    begin
      if (PHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
      begin
        PData:=PDevBroadcastVolume(Msg.lParam);
        for Index:=0 to 25 do
        if ((PData^.dbcv_unitmask shr Index) = 1) then
        begin
          LettreLecteur:=Chr(65+Index);
          break;
        end;
          If GetVolumeInformation(PChar(LettreLecteur+':\'),VolName,Max_Path,@VolSerial, FileMaxLen, FileFlags,FileSysName,Max_Path) then
          begin
          EspaceLibre:=DiskFree(Ord(LettreLecteur)-64);
          EspaceTotal:=DiskSize(Ord(LettreLecteur)-64);
          EspaceOccupe:=EspaceTotal-EspaceLibre;
          end;
      end;
    end;
 
    DBT_DEVICEREMOVECOMPLETE:
    begin
      if (PHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
      begin
        PData:=PDevBroadcastVolume(Msg.lParam);
        for Index:=0 to 25 do
        if ((PData^.dbcv_unitmask shr Index) = 1) then
        begin
          LettreLecteur:=Chr(65+Index);
          break;
        end;
      end;
    end;
  end;
end;
 
function TMediaConnected.GetSerialVolume:cardinal;
begin
  Result:=VolSerial;
end;
 
function TMediaConnected.GetNameVolume:string;
begin
  Result:=VolName;
end;
 
function TMediaConnected.GetLetterMedia:char;
begin
  Result:=LettreLecteur;
end;
 
function TMediaConnected.GetFreeSpace(TypeSizeReturn:String='octet'):double;
var
typeOfSize:TStringList;
begin
  typeOfSize:=TStringList.Create;
  typeOfSize.Add('Ko');
  typeOfSize.Add('Mo');
  typeOfSize.Add('Go');
  case typeOfSize.IndexOf(TypeSizeReturn) of
    0: Result:=EspaceLibre / 1024;
    1: Result:=EspaceLibre / 1048576;
    2: Result:=EspaceLibre / 1073741824;
    else
      Result:=EspaceLibre;
  end;
  typeOfSize.Free;
end;
 
function TMediaConnected.GetBusySpace(TypeSizeReturn:String='octet'):double;
var
typeOfSize:TStringList;
begin
  typeOfSize:=TStringList.Create;
  typeOfSize.Add('Ko');
  typeOfSize.Add('Mo');
  typeOfSize.Add('Go');
  case typeOfSize.IndexOf(TypeSizeReturn) of
    0: Result:=EspaceLibre / 1024;
    1: Result:=EspaceLibre / 1048576;
    2: Result:=EspaceLibre / 1073741824;
    else
      Result:=EspaceLibre;
  end;
  typeOfSize.Free;
end;
 
function TMediaConnected.GetSpace(TypeSizeReturn:String='octet'):double;
var
typeOfSize:TStringList;
begin
  typeOfSize:=TStringList.Create;
  typeOfSize.Add('Ko');
  typeOfSize.Add('Mo');
  typeOfSize.Add('Go');
  case typeOfSize.IndexOf(TypeSizeReturn) of
    0: Result:=(EspaceTotal - EspaceLibre) / 1024;
    1: Result:=(EspaceTotal - EspaceLibre) / 1048576;
    2: Result:=(EspaceTotal -EspaceLibre) / 1073741824;
    else
      Result:=EspaceTotal -EspaceLibre;
  end;
  typeOfSize.Free;
end;
end.
Est-ce possible de récupérer les infos de cette manière ou dois-je obligatoirement passer par la méthode standard, c'est à dire ne pas créer de composant ?

Merci pour votre aide