两种检测USB设备插入和移除的方法(Ver 2)

本文详细介绍了两种有效的方法来检测USB设备的插入和移除,涵盖了C++Builder和WinAPI技术,适用于软件开发者进行系统级别的监控。
摘要由CSDN通过智能技术生成
说明:
这篇文章是第二个版本。最初版本发布于
http://blog.csdn.net/jingzhongrong/archive/2007/01/02/1472440.aspx两种自动检测USB设备的添加和移除的方法
最初写这篇文章是因为当时看见一篇文章提出的判断方法是不断检测盘符变化,由于有更好的实现方法,因此写下那篇文章。在CSDN论坛上发现有很多提问是关于怎样判断USB插入和移除的,因此,修改一下最初版本的文章并增加一些更详细的描述,增加一些最初版本文章中没有涉及到的内容。
 
    关于下文出现的API函数的具体使用方法请自行查阅MSDN或者上网搜索。
    对于不负责任的转载或者直接复制代码的人,我将在文章中合适的位置写入相应的版权信息(在代码中出现时我会考虑到可读性,或者前面已经有该段代码的不完整版本,或者不影响阅读的变量名等等)

jingzhongrong

本文将提供如何判断、检测USB设备的插入和移除的操作。并不提供如何卸载USB设备的描述。
    下面详细描述两种检测判断方法。
    1、这种方法大概的思路就是在一个线程中循环获得当前系统的盘符,然后获取该盘符对应的设备类型,如果是USB设备会返回DRIVE_REMOVABLE(不一定都是USB设备)。
首先我们需要几个API函数来实现:
 

API 函数声明(详细用法请参见 MSDN
// 此函数用于获得当前磁盘驱动器盘符的位掩码
DWORD GetLogicalDrives(VOID)       
 
// 在此用于检测驱动器是否已经准备完毕
BOOL GetVolumeInformation(
LPCTSTR lpRootPathName,
LPTSTR lpVolumeNameBuffer,
DWORD nVolumeNameSize,
LPDWORD lpVolumeSerialNumber,
LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags,
LPTSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize)
  
// 此函数用于获得分区信息
UINT GetDriveType(LPCTSTR lpRootPathName)

 
 
接下来,我们实现一个用于判断驱动器分区信息的函数,用来检测是否为可移动磁盘。简单的,我们直接调用GetDriveType函数:
 

代码:检测是否为可移动磁盘
int CheckDisk(char *jzrdisk)
{
 if(GetDriveType(jzrdisk)==DRIVE_REMOVABLE) return 0;
   return -1;
}

 
 
下面是检测线程的执行函数,考虑到函数GetLogicalDrives返回的是一个位码,我们需要对该返回值进行一些处理才能调用 GetVolumeInformation 函数检查驱动器是否已经准备完毕。由于该位掩码的最低位代表的是 A 盘付,我们只需在循环中简单的使用移位便可:
 

代码:操作 GetLogicalDrives 函数返回的位掩码
DWORD jzr = GetLogicalDrives(); 
if (jzr!=0)
{
   for (int i=0;i<26;i++)    // 只判断 26 个盘符
    {
       if ((jzr & 1)==1)
        { </
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值