MFC具备检测设备的消息,但需要手动添加。针对USB设备,需要注册对应的GUID方可。本文对此进行简单记录。
本省略对MFC机制的描述,仅描述主要的模块代码。

一、步骤

Dbt.h头文件引用

在stdafx.h(或有关的头文件)添加Dbt.h头文件的引用:

#include <Dbt.h>

注册USB设备GUID

在对话框初始化函数中注册:

BOOL CFooDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// ...// 注册HID事件DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;memset(&DevBroadcastDeviceInterface, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE));DevBroadcastDeviceInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;// HID设备的GUID,可在设备管理器中查询,经查结果如下:// {745a17a0-74d3-11d0-b6fe-00a0c90f57da}// 注:使用真实的HID的GUID,反正检测不出来,如果是其它的GUID,所有USB事件都能检测出const GUID GUID_DEVINTERFACE_LIST[] = {{ 0xA5DCBF10, 0x6530, 0x11D2,{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } }, // USB设备{ 0x53f56307, 0xb6bf, 0x11d0,{ 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } }, // 磁盘(U盘){ 0x4D1E55B2, 0xF16F, 0x11CF,{ 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } }, // HID{ 0x745A17A0, 0x74D3, 0x11D0,{ 0xB6, 0xFE, 0x00, 0xA0, 0xC9, 0x0F, 0x57, 0xDA } }, // 另一个HID{ 0xad498944, 0x762f, 0x11d0,{ 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c } } }; // 网卡// 可以循环注册所有列出的GUID,此处只使用一种DevBroadcastDeviceInterface.dbcc_classguid = GUID_DEVINTERFACE_LIST[2];RegisterDeviceNotification(this->GetSafeHwnd(), &DevBroadcastDeviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE);}

说明1:不同的USB设备使用不同的GUID表示。在注册时需要指定要检测哪一类,本文针对HID,有兴趣者可使用其它来测试。
说明2:笔者使用的键盘有多个USB设备,其一为HID设备,在设备管理器中查询其类GUID为745a17a0-74d3-11d0-b6fe-00a0c90f57da
说明3:查询到的GUID与代码GUID结构体本质一样,形式不同。具体参考定义。

消息函数声明

在对话框头文件声明消息函数:

afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);

消息声明

在对话框实现文件中添加ON_WM_DEVICECHANGE消息:

BEGIN_MESSAGE_MAP(CFooDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_MESSAGE(WM_SHOWTASK, OnSystemtray)// ...ON_WM_SIZE()ON_WM_DESTROY()ON_WM_DEVICECHANGE() // USB HID设备检测消息
END_MESSAGE_MAP()

消息响应函数实现

下面实现OnDeviceChange函数:

BOOL CFooDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
{DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*)dwData;wchar_t vid[32] = { 0 };int offset = 4 * 3 + sizeof(GUID)+10;CString szInfo;int sendtype = 0;switch (nEventType){case DBT_DEVICEARRIVAL:{memcpy(vid, (char*)dwData + offset, 32);wchar_t* rr = wcsstr(vid, L"VID_AA55"); // !! 可过滤特定设备ID,下同if (rr == NULL){return FALSE;}szInfo.Format(L"提示信息: 设备已插入.\n");this->GetDlgItem(IDC_STC_DEVINFO)->SetWindowText(szInfo);}break;case DBT_DEVICEREMOVECOMPLETE:{// 注:dbd->dbcc_name只有1个字节,不能直接用其来做源地址拷贝,直接使用偏移,上同//wmemcpy(vid, (wchar_t*)dwData + offset, 32);memcpy(vid, (char*)dwData + offset, 32);wchar_t* rr = wcsstr(vid, L"VID_AA55");if (rr == NULL){return FALSE;}szInfo.Format(L"提示信息: 设备已移除.\n");this->GetDlgItem(IDC_STC_DEVINFO)->SetWindowText(szInfo);}break;default:{//szInfo.Format(L"[%d]got event: %d\n", cnt, nEventType);//this->GetDlgItem(IDC_STC_DEVINFO)->SetWindowText(szInfo);}break;}return TRUE;
}

注1:只有注册的设备,nEventType才有DBT_DEVICEARRIVAL、DBT_DEVICEREMOVECOMPLETE(当然也有其它值,按下不提),如果不注册,nEventType的值为7。
注2:查了些资料,说nEventType值不同,dwData亦不同。但本文没有深入研究。
注3:如果要针对某一种设备,如所属为HID,但厂家不同,则可以通过查找VID关键字来过滤。文中代码使用偏移量外加字符串搜索来实现,仅作示例,有些绕,但能实现功能。

后在 Windows 7 系统上用 VS 2015 编译,发现 ON_WM_DEVICECHANGE 出错,经排查,定位到

afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);

声明不兼容。修改为:

afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD_PTR dwData);

可解决编译问题,并且在 Win10 也能正常编译。

二、测试

使用

0xA5DCBF10, 0x6530, 0x11D2,{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED }

可以检测出所有的USB设备事件。包括U盘、键盘等。
使用

0x53f56307, 0xb6bf, 0x11d0,{ 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b }

只能检测出U盘事件。
使用

0x745A17A0, 0x74D3, 0x11D0,{ 0xB6, 0xFE, 0x00, 0xA0, 0xC9, 0x0F, 0x57, 0xDA }

检测不出HID事件(此处原因未知)。
但是,使用

0x4D1E55B2, 0xF16F, 0x11CF,{ 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 }

可以检测出HID事件。

三、小结

本文不过多涉及检测原理,代码测试通过。
需要指出的是,在 Windows 上使用 Qt 编程检测 USB 事件,也是使用本文所提到的技术,包括注册、响应事件。毕竟,无论 MFC 还是 Qt 程序,都是在 Windows 上运行的,可谓殊途同归。当然,如 Linux 或 MacOS 系统,机制已然不同,不在此列。

USB HID学习:MFC检测USB拔插事件相关推荐

  1. 响应USB接口为串口类型的拔插事件

    项目场景: 做了一个解析USB接口的GPS接收机报文的插件,界面如下: 由于,插件只有在整个软件打开时才会初始化,中途不会析构,那么使用过程中如果,GPS接收机拔出再插入另一接口,所有功能将失效,因为 ...

  2. linux u盘插入事件,Linux 下监控USB设备拔插事件

    Linux 下监控USB设备拔插事件 发布时间:2018-01-29 00:00, 浏览次数:1111 , 标签: Linux USB * 使用Netlink来实现 这是一个特殊的socket,可以接 ...

  3. 8.5.3耳麦拔插事件调用流程分析

    目录 回顾 input系统方法 回顾 在前面的小节中,我们编写了一个驱动程序,模拟耳机的插拔事件,其可以上报耳机的拔插事件,并且修改了android的源代码,可以根据耳机的拔插事件,在状态栏上现实或者 ...

  4. Android耳机拔插事件流程

    Android所有的input设备都会在/dev/input目录下生成对应的设备节点,一旦有任何输入事件产生,便会将事件写到这些节点下,同时对于外部输入设备(鼠标键盘等)的插拔还会引起这些节点的创建和 ...

  5. 08.音频系统:第003课_Linux音频驱动程序:第003节_耳麦拔插事件调用流程分析

    在前面的小节中,我们编写了一个驱动程序,模拟耳机的插拔事件,其可以上报耳机的拔插事件,并且修改了android的源代码,可以根据耳机的拔插事件,在状态栏上现实或者消除耳麦的图标,这节视频我们讲解耳麦插 ...

  6. USB HID学习:一点开发记录

    某天,曾经的前同事找我,说有个USB项目.因为知道我当时离职在找工作,于是转给我,然后介绍客户给我. 了解需求后,我分析了一下,主要是与USB设备通信的上位机,MFC我熟悉,USB找了一个开源的库hi ...

  7. Linux 下监控USB设备拔插事件

    使用Netlink来实现 这是一个特殊的socket,可以接受来自内核的消息 代码如下: 运行结果如下: 当有USB设备插入时: 当有USB设备拔出时: 2.使用udev的规则来实现 自2.6 核心开 ...

  8. USB HID学习:数据包分析

    本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理.文中未提到的知识,建议移步参考资源. 以笔者经验,直接阅读协议无法直观理解,最好使用工具抓包 ...

  9. 【C#】Winform监听USB串口设备拔插

    [C#]Winform监听USB串口设备拔插 零.问题 最近在开发串口相关的软件,需要检测串口拔掉后主动关闭串口,因此需要检测到USB的拔插事件. 一.解决 在主窗口From类下覆盖WndProc方法 ...

最新文章

  1. Eclipse NDK 配置,无需安装Cygwin
  2. puml绘制思维导图_如何用ProcessOn画出漂亮的思维导图
  3. R语言获得所有Aesthetics(美学映射)参数:使用长表输出、使用宽表输出
  4. 今天做内存操作系统(xp装在内存中)
  5. Java wait forever_彻底搞清楚Java并发 (一) 基础
  6. 逻辑回归还能这样解?关于Kernel Logistic Regression的详细解释
  7. python处理行情数据_请教 Python 如何解析 DBF 文件, SJSHQ.dbf 上交所行情文件,数据来源于巨灵数据。...
  8. Kafka 入门和 Spring Boot 集成
  9. Java命令学习系列(零)——常见命令及Java Dump介绍
  10. C语言开发笔记(八)static
  11. LeetCode 1819. 序列中不同最大公约数的数目
  12. python入门之函数调用第二关_Python入门之函数调用——第2关:函数正确调用 - 得到想要的结果...
  13. C++单例实现及回收(转)
  14. 距离向量算法与链路状态算法(RIP、OSPF)
  15. 《普林斯顿微积分读本》笔记-第2章三角学回顾
  16. python验证码登录代码_Python模拟登录验证码(代码简单)
  17. android viewholder静态,使用内部viewHolder时声明为static的原因
  18. 搭建虚拟局域网云服务器,搭建虚拟局域网云服务器
  19. 在html中加入网址,网页超链接怎么做,添加超链接网址的的详细步骤
  20. iOS App技术支持网址(URL)

热门文章

  1. 2199元起!荣耀60 SE真机上手图公布:相机模组造型眼熟
  2. 果然十三香!iPhone13系列正式发布:看到价格后酸了
  3. 戴志坚接替李小加出任职港交所行政总裁 基本年薪700万港元
  4. 卖不动了,5G资费套餐再降价,网友:再等等再等等
  5. iPhone 11系列低至4599元,40亿消费券开抢!618正式开启了
  6. 用户一片哀嚎!三星手机系统突遇大面积崩溃:现黑屏、重启、乱码
  7. 这个城市推出黄金“外卖”!价值低于5.8万元的,只能摩托车配送...
  8. 10大淘宝直播之城公布:杭州、广州、连云港位列前三
  9. iPhone 12 Pro Max机模曝光:有乔布斯内味儿了
  10. 阿里巴巴公布香港IPO定价:每股176港元