说明:
这篇文章是第二个版本。最初版本发布于
http://blog.youkuaiyun.com/jingzhongrong/archive/2007/01/02/1472440.aspx两种自动检测USB设备的添加和移除的方法
最初写这篇文章是因为当时看见一篇文章提出的判断方法是不断检测盘符变化,由于有更好的实现方法,因此写下那篇文章。在优快云论坛上发现有很多提问是关于怎样判断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)
{ </
|