Ovo sam koristio u jednom komercijalnom programu, radi kao sat.
Detektuje USB disk, u DriveLetter je slovo pod kojim se prijavio u sistem. Definicije tipova su prepisane iz JCL biblioteke.
Code:
TForm1 = class(TForm)
private
procedure FOnDeviceChange(var Message: TMessage); message WM_DEVICECHANGE;
public
end;
implementation
type
_DEV_BROADCAST_HDR = record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
end;
{$EXTERNALSYM _DEV_BROADCAST_HDR}
DEV_BROADCAST_HDR = _DEV_BROADCAST_HDR;
{$EXTERNALSYM DEV_BROADCAST_HDR}
PDEV_BROADCAST_HDR = ^DEV_BROADCAST_HDR;
{$EXTERNALSYM PDEV_BROADCAST_HDR}
TDevBroadcastHdr = DEV_BROADCAST_HDR;
PDevBroadcastHdr = PDEV_BROADCAST_HDR;
PDEV_BROADCAST_VOLUME = ^DEV_BROADCAST_VOLUME;
{$EXTERNALSYM PDEV_BROADCAST_VOLUME}
_DEV_BROADCAST_VOLUME = record
dbcv_size: DWORD;
dbcv_devicetype: DWORD;
dbcv_reserved: DWORD;
dbcv_unitmask: DWORD;
dbcv_flags: WORD;
end;
{$EXTERNALSYM _DEV_BROADCAST_VOLUME}
DEV_BROADCAST_VOLUME = _DEV_BROADCAST_VOLUME;
{$EXTERNALSYM DEV_BROADCAST_VOLUME}
TDevBroadcastVolume = DEV_BROADCAST_VOLUME;
PDevBroadcastVolume = PDEV_BROADCAST_VOLUME;
procedure TForm1.FOnDeviceChange(var Message: TMessage);
var
i: Integer;
DriveLetter: Char;
begin
inherited;
if (Message.WParam = $8000) then
begin
if (DEV_BROADCAST_HDR(Pointer(Message.LParam)^).dbch_devicetype = $00000002) then
begin
i := 65 + Round(Log2(Extended(DEV_BROADCAST_VOLUME(Pointer(Message.LParam)^).dbcv_unitmask + 0.0)));
DriveLetter := Chr(i);
// ...
end;
end;
end;