首先捕捉WM_DEVICECHANGE消息,该消息在usb插拔时均有触发。

MFC下  

添加消息处理函数afx_msg BOOL OnDeviceChange( UINT nEventType, DWORD dwData );

添加消息映射BEGIN_MESSAGE_MAP()

...

ON_WM_DEVICECHANGE()

END_MESSAGE_MAP()

Win32 在消息回调处理即可

MFC下  nEventType 在没有注册设备的情况下均为7,无法区分,需要设备GUID去注册,方法如下:

USB Raw Device/USB设备

{a5dcbf10-6530-11d2   -901f-00c04fb951ed}

Disk Device/磁盘设备

{53f56307-b6bf-11d0   -94f2-00a0c91efb8b}

Network Card/网卡

{ad498944-762f-11d0   -8dcb-00c04fc3358c}

Human Interface Device (HID)/人机界面设备

{4d1e55b2-f16f-11cf    -88cb-001111000030}

Palm/手持设备

{784126bf-4190-11d4   - b5c2-00c04f687a67}

HDEVNOTIFY hDevNotify;
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; for(int i=; i<sizeof(GUID_DEVINTERFACE_LIST)/sizeof(GUID); i++)
{
  NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];
  hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
  if( !hDevNotify )
  {
    return FALSE;
  }
}
注册代码请在程序初始化时进行,如MFC的OnInitDialog
 
在消息响应中
switch(nEventType)
{
  case DBT_DEVICEARRIVAL://设备可用
  {
  // PDEV_BROADCAST_DEVICEINTERFACE
  if(lpdb->dbch_devicetype==DBT_DEVTYP_VOLUME)
  {   PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
  switch(lpdbv->dbcv_flags)
  {
  dosomething
  }
}
  else if(lpdb->dbch_devicetype==DBT_DEVTYP_DEVICEINTERFACE)
  {
  }
  else
  {
  }
}
以上方法较为复杂,需要处理DBT_DEVTYP_VOLUME,DBT_DEVTYP_DEVICEINTERFACE等,现提供一种简单的方法,在DBT_DEVICEARRIVAL有新设备进入时,通过遍历硬件设备变相处理:
//以找usb设备为例,取得的usb盘符放在UsbRoot里面,len为UsbRoot字符数组的长度  

BOOL GetUsbRoot(CHAR* UsbRoot,SHORT len)
{
  DWORD dwDriveStrLen = ;
  CHAR *pDriveName = NULL;
  UINT Drive = ;
  if (UsbRoot == NULL || len <= )
  {
    return FALSE;
  }
  dwDriveStrLen = ::GetLogicalDriveStrings(,NULL);//取得你计算机上盘符数目
  if ( == dwDriveStrLen)
  {
    return FALSE;
  }
  CHAR *szDriveNameBuff = (CHAR*)malloc(dwDriveStrLen);//根据你机器上的磁盘数目分配内存
  if (NULL == szDriveNameBuff)
  {
    return FALSE;
  }
  memset(szDriveNameBuff,,sizeof(szDriveNameBuff));
  ::GetLogicalDriveStrings(dwDriveStrLen,szDriveNameBuff);//取得你计算机上所有盘符
  pDriveName = szDriveNameBuff;   while (*pDriveName != NULL)//遍历所有盘符,找到你需要的设备
  {
    Drive = ::GetDriveType(pDriveName);
  switch (Drive)
  {
  case DRIVE_UNKNOWN://未知设备
    break;
  case DRIVE_NO_ROOT_DIR:
    break;
  case DRIVE_REMOVABLE://usb设备
  //如果为usb,在这里进行相关处理
  //break;
  case DRIVE_FIXED://硬盘
    break;
  case DRIVE_REMOTE://网络硬盘,如:局域网服务器上的盘
    break;
  case DRIVE_CDROM://光驱
    break;
  case DRIVE_RAMDISK://RAM 盘
    break;
  default:
    break;
}
  pDriveName += strlen(pDriveName) + ;
} if(szDriveNameBuff != NULL)
{
  free(szDriveNameBuff);
  szDriveNameBuff = NULL;
} return FALSE; }

原文:

VC++实现USB 硬盘等硬件插拔检测

VC++检测硬件设备状态的更多相关文章

  1. VC++检测当前网络状态

    VC获得本机网络连接状态 转载:http://www.cppblog.com/wrhwww/archive/2010/12/02/135230.html //本机网络连接类型(成功) #define ...

  2. 【转载】CentOS下查看电脑硬件设备属性命令

    CentOS下查看电脑硬件设备属性命令2018年09月13日 17:48:31 乔烨 阅读数 510如何在linux下查看电脑硬件设备属性 # uname -a # 查看内核/操作系统/CPU信息 # ...

  3. 使用python检测一个设备是否ping的通

    使用python检测一个设备是否ping的通 一,subprocess以及常用的封装函数 运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并 ...

  4. C#枚举硬件设备(升级版)

    原文:C#枚举硬件设备(升级版) 先取设备类型: ; } }

  5. Studio 5000编程:如何判断AB PLC系统中的硬件设备是否在正常工作

    前言:PLC控制系统,主要由CPU.本机架I/O模块,分布式I/O模块,通信模块,或其他设备(如:伺服驱动器.交换机.第三方设备)等组成,如何判断这些设备是否工作正常?或是一旦出现故障,能在第一时间判 ...

  6. PHP检测移动设备类mobile detection使用实例

    目前,一个网站有多个版本是很正常的,如PC版,3G版,移动版等等.根据不同的浏览设备我们需要定向到不同的版本中.不仅如此,我们有时候还需要根据不同的客户端加载不同的CSS,因此我们需要能够检测浏览设备 ...

  7. usb由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备

    在设备管理器的usb设备的属性中,显示提示“由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备”.注册表坏了.经过查询,解决方法如下: 方法:打开注册表编辑器(开始--& ...

  8. Android -- 检测耳机插入状态

    原理                                                                                    其实android系统在耳机 ...

  9. 使用RSA非对称密钥算法实现硬件设备授权

    一.硬件设备授权 即用户在硬件设备输入一个序列号(或一个包含授权信息的文件),然后硬件设备便可正常使用.    二.授权方案 构思授权方案时,参考了下面网址的思路: http://bbs.csdn.n ...

随机推荐

  1. HubbleDotNet 开源全文搜索数据库项目--为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式

    关系型数据库中,多表关联是很常见的事情,HubbleDotNet 可以对部分情况的多表关联形式建立关联的全文索引,这样用户就不需要专门建一个大表 来解决多表关联时的全文索引问题. 下面以 为数据库现有 ...

  2. 四:网络--NSURLConnection基本使用

    一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法.请求头.请求体.... ...

  3. Python实现跨文件全局变量的方法

    Python 中 global 关键字可以定义一个变量为全局变量,但是这个仅限于在一个模块(py文件)中调用全局变量,在另外一个py文件 再次使用 global x 也是无法访问到的,因为在这个py模 ...

  4. 杂项-Java:JBoss

    ylbtech-杂项-Java:JBoss 是一个基于J2EE的开放源代码的应用服务器. JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用.JBoss是一个管理EJB的容器和服务器,支持E ...

  5. codeforces round #433 div2

    A:枚举一下就行了...居然wa了一发,题目一定要看清 #include<bits/stdc++.h> using namespace std; int n; int main() { c ...

  6. myeclipse 导入maven

    一安装maven 先安装jdk,配置JAVA_HOME 把下载的maven bin包,解压到指定目录,比如:D:\apache-maven-3.3.9-bin 配置maven的系统变量M2_HOME和 ...

  7. 【转载】SQL面试题

    [本文转自]http://blog.csdn.net/u012467492/article/details/46790205 1.用一条SQL 语句 查询出每门课都大于80 分的学生姓名 name   ...

  8. bzoj 1306: [CQOI2009]match循环赛【dfs+剪枝】

    大力剪枝,最后洛谷上还开了o2才过-- 大概这样剪枝: 1.搜索中,一个队当前得分超过要求或者一个队剩下的比赛场数全赢也达不到要求则return: 2.注意到如果平局,最总分的贡献是2,否则是3,所以 ...

  9. bzoj 2115: [Wc2011] Xor【线性基+dfs】

    -老是想到最长路上 其实可以这样:把每个环的xor和都存起来,然后任选一条1到n的路径的xor和ans,答案就是这个ans在环的线性基上跑贪心. 为什么是对的--因为可以重边而且是无相连通的,并且对于 ...

  10. Word Cloud (词云) - JavaScript

    在上一篇中已经分享了用 Python 创建词云了.接下来继续总结其他创建词云的方法. >> Create Word Cloud via JavaScript JavaScript 可以借助 ...