您现在的位置: > 首页 > 程序开发 > Delphi教程
>> 最新教程
>> 热门教程
>> 最新游戏资讯
>> 热门游戏资讯
delphi 监视U盘的状态
作者:                来自:安迪教程网                 加入时间:10-09-10                进入论坛讨论







delphi 监视U盘的状态


           一个不错的代码


  


其实系统中的任何事件都是有消息的,U盘的插拨也不例外,让程序去接收这些消息就能知道U盘的状态
此处我写了一个Demo程序,用来监视U盘插上或拨下。


主要的问题就在如何去接收消息,以及接收什么消息。
在DBT单元中,封装了与驱动有关的消息及API,我们只需要稍做研究,即可写出这个程序了。







一、接管消息


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;


在上面的代码中,需要注意的是设备的状态。因为从接到的消息来看,我们找不到U盘的盘符
只能够通过此方法进行设备的遍历。



 




相关教程
联系方式:QQ:6084884 email:agwcn@126.com 粤ICP备10101711号
本网站中发布的文章只代表发表人的个人观点,不代表安迪教程网网站的立场
copyright© 2000-2004 安迪教程网 All rights reserved agwcn.com