// Windows应用程序都是基于消息/事件驱动的,任何一个窗口都能接收消息,并对该消息作出相应的处理。// U盘等移动设备的插入或者移除操作有与之对应的消息-WM_DEVICECHANGE。实现监控U盘的插入和拔出,只需要捕获这个消息并对它进行处理即可实现。// PS:WindowProc函数:
// 功能:消息处理回调函数。
// 原型:LRESULT CALLBACK WindowProc (
//         HWND hwnd,
//         UINT uMsg,
//         WPARAM wParam,
//         LPARAM lParam
//       )
// 参数:hwnd:指定窗口的句柄。
//       uMsg:消息ID,是一个枚举值,这里是WM_DEVICECHANGE.
//       wParam:消息附带的参数,改参数可以是Dbt.h头文件中的以下值之一:
//            DBT_CONFIGCHANGECANCELED:更改当前配置(插入或移除)的请求已取消。
//            DBT_CONFIGCHAGED:由于插入或移除,当前配置已更改。
//            DBT_CUSTOMLEVEL:发生了自定义事件。
//            DBT_DEVICEARRIVAL:已插入了设备或介质,现在可以使用它。
//            DBT_DEVICEQUERYREMOVE:请求删除设备或介质的权限。
//            DBT_DEVICEREMOVECOMPLETE:已删除设备或介质。
//            DBT_DEVICEREMOVEPENDING:即将删除一个介质或设备。
//            DBT_DEVICETYPESPECIFIC:设备发生特定事件。
//            DBT_DEVNODES_CHANGED:已将设备添加到系统或从系统中删除。
//            DBT_QUERYCHANGECONFIG:请求权限更改当前配置。
//            DBT_USERDEFINED:此消息的含义是由用户自己定义。
//       lParam:指向由事件特定的数据结构的指针。其格式取决于wParam参数的值。
// 结果:若返回TRUE表示授予请求。若返回BROADCAST_QUERY_DENY表示拒绝该请求。// PS:监控U盘插入或删除,wParam应当为DBT_DEVICEREMOVECOMPLETE和DBT_DEVICEARRIVAL两个。// PS:DEV_BROADCAST_HDR结构:
// 定义:typedef struct _DEV_BROADCAST_HDR {//           DWORD dbch_size;
//           DWORD dbch_devicetype;
//           DWORD dbch_reserved;
//       } DEV_BROADCAST_HDR, *PDEV_BROADCAST_HDR;
// 成员:dbch_size:指向这个结构的代销。如果这是由用户自定义的事件,则该成员必须是此标头的大小加上DEV_BROADCAST_USERDEFINED结构中的可变长度数据的大小。
//       dbch_devicetype:指定设备类型,确定前三个成员之后的事件特定信息。为以下值之一:
//           DBT_DEVTYP_DEVICEINTERFACE:设备类,对应DEV_BROADCAST_DEVICEINTERFACE结构。
//           DBT_DEVTYP_HANDLE:文件系统句柄,对应DEV_BROADCAST_HANDLE结构。
//           DBT_DEVTYP_OEM:OEM或IHV定义的设备类型,对应DEV_BROADCAST_OEM结构。
//           DBT_DEVTYP_PORT:端口设备,对应DEV_BROADCAST_PROT结构。
//           DBT_DEVTYP_VOLUME:逻辑卷,对应DEV_BROADCAST_VOLUME结构。
//       dbch_reserved:保留。// PS:DEV_BROADCAST_VOLUME结构:
// 定义:typedef struct _DEV_BROADCAST_VOLUME {//           DWORD dbcv_size;
//           DWORD dbcv_devicetype;
//           DWORD dbcv_reservced;
//           DWORD dbcv_unitmask;
//           WORD dbcv_flags;
//      } DEV_BROADCAST_VOLUME, *PDEV_BROADCAST_VOLUME;
// 参数:前面三个成员和DEV_BROADCAST_HDR相同。
//       dbcv_unitmask:标识一个或多个逻辑单元的位源码。掩码中的每位对应于一个逻辑驱动器。位0标识驱动器A,位1标识驱动器B,以此类推。
//       dbcv_flags:DBTF_MEDIA:更改影响驱动器的介质。DBTF_NET:指示逻辑卷是一个网络卷。// PS:实现原理:
// 在消息回调函数WindowProc中拦截设备操作对应的消息WM_DEVICECHANGE,再判断wparam参数的类型,如果是DBT_DEVICEARRIVAL表示设备插入成功,
// 如果是DBT_DEVICEREMOVECOMPLETE表示设备移除成功。先将lparam转为DBT_BROADCAST_HDR,去其成员dbcv_deivcetype,U判断操作对应DEV_BROADCAST_VOLUME,
// 然后再讲lparam转变为DEV_BROADCAST_VOLUME结构体,获取成员dbcv_unitmask,这是一个位掩码,使用for循环来对它的每一位检测,其位上为1在获取到其盘符。// 示例代码:BEGIN_MESSAGE_MAP(...)ON_MESSAGE(WM_DEVICECHANGE, OnDeviceChange)
END_MESSAGE_MAP()LRESULT OnDeviceChange(WPARAM wParam, LPARAM lParam)
{switch (wParam){// 设备已插入case DBT_DEVICEARRIVAL:// 设备已移除case DBT_DEVICEREMOVECOMPLETE:{// 转换结构体PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;// 逻辑卷if (DBT_DEVTYP_VOLUME == lpdb.dbcv_devicetype){// 根据decv_unitmask计算出设备盘符PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;DWORD dwDriverMask = lpdbv->dbcv_unitmask;DWORD dwTemp = 1;char szDriver[4] = "A:\\";for (szDriver[0] == 'A'; szDriver[0] <= 'Z'; ++szDriver[0]){if (0 < dwTemp & dwDriverMask){// 获取设备盘符::MessageBox(NULL, szDriver, "设备已插入", MB_OK);// MessageBox(NULL, szDriver, "设备已移除", MB_OK);}// 移位操作dwTemp = (dwTemp << 1);}}}break;default:break;}
}

Windows下的U盘监控相关推荐

  1. cd 在windows下 无法切换盘符目录

    在windows下, 打开cmd.exe, 默认进入到当前用户主目录下, 发现除了C:\盘, 可以通过cd .. , cd , dir 去到C:\盘的各个目录外, 不能通过 cd d: 进入到其他盘 ...

  2. windows下的ubuntu盘符问题

    Windows下访问其子系统Ubuntu的文件 C:\Users\72863\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_ ...

  3. 使用 qt 在 windows 下开发云盘软件

    在 Windows 下使用 Qt 开发云盘软件需要您先安装 Qt 开发环境,然后进行如下步骤: 创建一个新的 Qt 工程. 在工程中添加必要的界面元素,包括登录界面.文件列表界面.上传/下载文件界面等 ...

  4. Windows下本机简易监控系统搭建(Telegraf+Influxdb+Grafana)

    一.文件准备 1.1 文件名称 telegraf-1.2.1_windows_amd64.zip influxdb-1.2.2_windows_amd64.zip grafana-4.2.0.wind ...

  5. Windows下本机简易监控系统搭建(Telegraf+Influxdb+Grafana)--转

    原文地址:http://www.cnblogs.com/liugh/p/6683488.html 一.文件准备 1.1 文件名称 telegraf-1.2.1_windows_amd64.zip in ...

  6. Windows下使用Jconsole远程监控Linux系统中java服务器资源占用情况

    1.首先需要停止正在运行的服务:resin-XXX stop 2.然后在Linux的服务器启动项中添加如下信息: -Djava.rmi.server.hostname=192.168.1.122-Dc ...

  7. windows下插入u盘怎么使用qt进行读取_【技术篇】Windows系统使用爱思助手制作越狱 U 盘教程...

    CheckRa1n 越狱工具需要在 macOS 系统上进行安装,借助电脑端爱思助手制作越狱 U 盘后,即可在 Windows 电脑上使用 CheckRa1n 进行越狱. 支持设备:iPhone 5S ...

  8. 新的服务器装Ubuntu系统(如何在windows下制作启动盘以及如何安装Ubuntu系统)

    1.准备一块4GB以上的空U盘 2.https://rufus.ie/  下载rufus 到windows电脑 3. 插入U盘,打开 rufus 软件 如是操作即可. 4.https://www.ub ...

  9. Windows下运行Redis-网盘链接-简单粗暴-亲测有用

    链接:https://pan.baidu.com/s/1bTnb1s39ADv0tisbdxgavw 提取码:hzyd 在解压后的文件目录下运行redis-server.exe redis.windo ...

最新文章

  1. C++_STL——deque and vector
  2. boost::integer::mod_inverse用法的测试程序
  3. centos安装ES(elasticsearch)
  4. 计算机图形学颜色表示,计算机图形学 颜色表示模型.ppt
  5. HALCON学习之旅(一)
  6. 折半查找和二叉排序树的时间性能_详解二叉排序树(基础篇)
  7. 2010计算机知识点总结,2010年全国职称计算机考试:知识点笔记第一章
  8. 华为机试HJ99:自守数(附带提速方案)
  9. Jenkins骚操作第十三章之基于Kubernetes/K8S构建Jenkins持续集成平台(上)
  10. ios识别人脸自动拍照_iOS 相机流人脸识别(一)-人脸框检测(基于iOS原生)
  11. amd的服务器cpu型号大全,AMD CPU型号大全
  12. 了解TrustZone,读了这篇就够了
  13. VOB文件用什么软件打开,VOB文件如何转换成MP4格式
  14. 零基础学习Java真的很难?初学者必须了解的Java基础知识梳理
  15. java Object class分析
  16. 【VHDL】半减器 and 或门 组成 全减器
  17. (翻译)Apache Kafka 官方文档:开始
  18. HTML侧面导航栏效果
  19. 银行储蓄管理系统 课程设计
  20. LibGdx练习-像素鸟(一)

热门文章

  1. HTML+CSS学习笔记(篇幅较大)
  2. 2021.4.14 html学习第二天
  3. 最全移动端UI设计规范,作为前端的你,了解多少?
  4. 【可视化开发】数据大屏可视化技术汇总
  5. 灵异问题,使用EasyConnect后,用navicat可以访问数据库,但是用Idea跑项目连接超时怎么办?
  6. ps怎么把黑白照片变成彩色?ps把儿童黑白照变彩色教程
  7. win10触摸板升级教程
  8. 使用fiddler实现手机抓包
  9. 【面试】google电面等
  10. 三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经