VC++检测硬件设备状态
首先捕捉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;
}
}
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
{
}
}
//以找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++检测硬件设备状态的更多相关文章
- VC++检测当前网络状态
VC获得本机网络连接状态 转载:http://www.cppblog.com/wrhwww/archive/2010/12/02/135230.html //本机网络连接类型(成功) #define ...
- 【转载】CentOS下查看电脑硬件设备属性命令
CentOS下查看电脑硬件设备属性命令2018年09月13日 17:48:31 乔烨 阅读数 510如何在linux下查看电脑硬件设备属性 # uname -a # 查看内核/操作系统/CPU信息 # ...
- 使用python检测一个设备是否ping的通
使用python检测一个设备是否ping的通 一,subprocess以及常用的封装函数 运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并 ...
- C#枚举硬件设备(升级版)
原文:C#枚举硬件设备(升级版) 先取设备类型: ; } }
- Studio 5000编程:如何判断AB PLC系统中的硬件设备是否在正常工作
前言:PLC控制系统,主要由CPU.本机架I/O模块,分布式I/O模块,通信模块,或其他设备(如:伺服驱动器.交换机.第三方设备)等组成,如何判断这些设备是否工作正常?或是一旦出现故障,能在第一时间判 ...
- PHP检测移动设备类mobile detection使用实例
目前,一个网站有多个版本是很正常的,如PC版,3G版,移动版等等.根据不同的浏览设备我们需要定向到不同的版本中.不仅如此,我们有时候还需要根据不同的客户端加载不同的CSS,因此我们需要能够检测浏览设备 ...
- usb由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备
在设备管理器的usb设备的属性中,显示提示“由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备”.注册表坏了.经过查询,解决方法如下: 方法:打开注册表编辑器(开始--& ...
- Android -- 检测耳机插入状态
原理 其实android系统在耳机 ...
- 使用RSA非对称密钥算法实现硬件设备授权
一.硬件设备授权 即用户在硬件设备输入一个序列号(或一个包含授权信息的文件),然后硬件设备便可正常使用. 二.授权方案 构思授权方案时,参考了下面网址的思路: http://bbs.csdn.n ...
随机推荐
- lucene 索引文件大小分布_tim
Hi, I have index ~31G where27% of the index size is .fdt files (8.5G)20% - .fdx files (6.2G)37% - .f ...
- ModelAndView存取数Model、Map、ModelMap
1.从名字上看ModelAndView中的Model代表模型,View代表视图,这个名字就很好地解释了该类的作用.(对应mvc配置,寻找模型,返回视图.) 2.业务处理器调用模型层处理完用户请求后,把 ...
- bzoj4326
二分+树剖+差分 之前的做法naive,莫名其妙的wa,明明uoj95分 看到最小最大上二分,树上路径问题直接剖,然后问题就转化成了一个判定问题,每次二分出最长路径长度,问能不能达到.那么我们就把所有 ...
- Ubuntu12.04中新的快捷键(转载)
转自:http://blog.51osos.com/linuxnews/ubuntu12-04%E4%B8%AD%E6%96%B0%E7%9A%84%E5%BF%AB%E6%8D%B7%E9%94%A ...
- Linux 系统管理命令 - mpstat - CPU信息统计
命令详解 重要星级: ★★★★☆ 功能说明: mpstat 是 Multiprocessor Statistics 的缩写,是一种实时系统监控工具.mpstat 命令会输出 CPU 的一些统计信息,这 ...
- window切换Java版本原因
查找Path环境变量的变量指向的目录,有一个Oracle目录存放着几个 java,javac等可执行文件,删除这个路径或文件就可以执行你指定的JavaHome目录拉 详情参考: https://blo ...
- Rebel 6 破解版及使用方法
下载地址:http://www.zeroturnaround.com/jrebel/download/ 下载下来的是一个Zip压缩包,打开之后会发现一个jrebel.jar,这就是其最重要的运 ...
- codeforces 880E. Maximum Subsequence(折半搜索+双指针)
E. Maximum Subsequence time limit per test 1 second memory limit per test 256 megabytes input standa ...
- 【插件开发】—— 11 窃听风云(Java事件监听原理-GEF实例讲解)
前文回顾: 1 插件学习篇 2 简单的建立插件工程以及模型文件分析 3 利用扩展点,开发透视图 4 SWT编程须知 5 SWT简单控件的使用与布局搭配 6 SWT复杂空间与布局搭配 7 SWT布局详解 ...
- 动态规划基础复习 By cellur925
结束帝都的qbxt dp图论精讲班后,感觉自己依然很水,接下来的一周,不妨来复习一下讲课内容:) 动态规划是lyd讲的,上次在泉城讲数据结构,然鹅体验较差,这次虽说好了些,但还是比想象中的效果不好(还 ...