一、接管消息
01 procedure TFormMain.WndProc(var Message: TMessage);
02 var
03 hdr: PDevBroadcastHdr;
04 vol: PDevBroadcastVolume;
05 begin
06 if Message.Msg = WM_DEVICECHANGE then
07 begin
08 case Message.WParam of
09 DBT_DEVICEARRIVAL:
10 begin
11
12 hdr := PDevBroadcastHdr(Message.LParam);
13 if hdr.dbch_devicetype = DBT_DEVTYP_VOLUME then
14 begin
15 vol := PDevBroadcastVolume(Message.LParam);
16 if vol.dbcv_flags = 0 then
17 AddDisk;
18 end;
19
20 end;
21 DBT_DEVICEREMOVECOMPLETE:
22 RemoveDisk;
23 end;
24 end;
25
26 inherited;
27 end;
注意上面标红字的地方,这些就是我们需要的消息,接到这个消息就成功了一半了。
接下面,我们来实现AddDisk()和RemoveDisk()方法,这两个方法用于在程序界面上显示或移除设备。
二、显示已插上的U盘,除除已拨下的U盘
01 procedure TFormMain.AddDisk;
02 var
03 diskPath: string;
04 i: Integer;
05 begin
06 diskPath := 'C:\\';
07 for i:= $43 to $5A do
08 begin
09 diskPath[1] := Char(i);
10 if GetDriveType(PChar(diskPath)) = DRIVE_REMOVABLE then
11 begin
12 if lstUDisk.Items.IndexOf(Format(UDiskFmt, [diskPath[1]])) = -1 then
13 begin
14 lstUDisk.Items.Add(Format(UDiskFmt, [diskPath[1]]));
15 Break;
16 end;
17 end;
18 end;
19 end;
20
21 procedure TFormMain.RemoveDisk;
22 var
23 diskPath: string;
24 i: Integer;
25 begin
26 diskPath := 'C:\\';
27 for i:= $43 to $5A do
28 begin
29 diskPath[1] := Char(i);
30 if GetDriveType(PChar(diskPath)) = DRIVE_NO_ROOT_DIR then
31 begin
32 if lstUDisk.Items.IndexOf(Format(UDiskFmt, [diskPath[1]])) > -1 then
33 begin
34 lstUDisk.Items.Delete(lstUDisk.Items.IndexOf(Format(UDiskFmt, [diskPath[1]])));
35 Break;
36 end;
37 end;
38 end;
39 end;