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
| unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Registry, StdCtrls;
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
TForm1 = class(TForm)
private
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMDeviceChange(var Msg: TMessage);
var PHeader : PDevBroadcastHeader; PData : PDevBroadcastVolume; Index : Integer; DriveLetter : char;
begin inherited;
PHeader:=PDevBroadcastHeader(Msg.lParam);
DriveLetter:=#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 DriveLetter:=Chr(65+Index); break; end;
Application.MessageBox(PChar('Inserted drive letter : '+DriveLetter),'',0);
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 DriveLetter:=Chr(65+Index); break; end;
Application.MessageBox(PChar('Removed drive letter : '+DriveLetter),'',0);
end;
end;
end;
end;
end. |
Partager