Delphi监视U盘的状态代码范例

本文介绍了一个使用Delphi编写的简单程序,该程序能够监听并响应U盘插入和拔出事件。通过Windows的消息机制,程序能准确地捕捉到U盘状态的变化,并更新其界面以显示当前连接的所有可移动磁盘。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

一、接管消息

procedure TFormMain.WndProc(var Message: TMessage);
var
hdr: PDevBroadcastHdr;
vol: PDevBroadcastVolume;
begin
if Message.Msg = WM_DEVICECHANGE then
begin
     case Message.WParam of
       DBT_DEVICEARRIVAL:
         begin

           hdr := PDevBroadcastHdr(Message.LParam);
           if hdr.dbch_devicetype = DBT_DEVTYP_VOLUME then
           begin
             vol := PDevBroadcastVolume(Message.LParam);
             if vol.dbcv_flags = 0 then
               AddDisk;
           end; 

         end;
       DBT_DEVICEREMOVECOMPLETE:
         RemoveDisk;
     end;
end;

inherited;
end;

注意上面标红字的地方,这些就是我们需要的消息,接到这个消息就成功了一半了。
接下面,我们来实现AddDisk()和RemoveDisk()方法,这两个方法用于在程序界面上显示或移除设备。

二、显示已插上的U盘,除除已拨下的U盘

procedure TFormMain.AddDisk;
var
diskPath: string;
i: Integer;
begin
diskPath := 'C:\\';
for i:= $43 to $5A do
begin
     diskPath[1] := Char(i);
     if GetDriveType(PChar(diskPath)) = DRIVE_REMOVABLE then
     begin
       if lstUDisk.Items.IndexOf(Format(UDiskFmt, [diskPath[1]])) = -1 then
       begin
         lstUDisk.Items.Add(Format(UDiskFmt, [diskPath[1]]));
         Break;
       end;
     end;
end;
end;

procedure TFormMain.RemoveDisk;
var
diskPath: string;
i: Integer;
begin
diskPath := 'C:\\';
for i:= $43 to $5A do
begin
     diskPath[1] := Char(i);
     if GetDriveType(PChar(diskPath)) = DRIVE_NO_ROOT_DIR then
     begin
       if lstUDisk.Items.IndexOf(Format(UDiskFmt, [diskPath[1]])) > -1 then
       begin
         lstUDisk.Items.Delete(lstUDisk.Items.IndexOf(Format(UDiskFmt, [diskPath[1]])));
         Break;
       end;
     end;
end;
end;

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

转载于:https://www.cnblogs.com/lzj1981/archive/2013/04/28/3049402.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值