开发windows MFC 应用程序时,经常会操作一些硬件设备,那么如何实现设备的热插拔功能呢,下面给出具体操作步骤:

1,给要实现设备热插拔的窗体/界面 添加  ON_WM_DEVICECHANGE() 消息,如下在 BEGIN_MESSAGE_MAP (...)

与END_MESSAGE_MAP() 之间加入 一行“ ON_WM_DEVICECHANGE() ”

BEGIN_MESSAGE_MAP(CServoTestDlg, CDialog)...ON_WM_DEVICECHANGE()...END_MESSAGE_MAP()

2,给窗体注册 插拔事件,一般可在 OnInitDialog()函数 中加入 ,代码如下:

BOOL xxx::OnInitDialog()
{int i,j;CDialog::OnInitDialog();...//注册插拔事件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 = 0; 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;}}return TRUE;
}

上面中会用到一些常量 GUID_DEVINTERFACE_LIST ,这里定义了 设备的一些信息,如下:

static const GUID GUID_DEVINTERFACE_LIST[] =
{// GUID_DEVINTERFACE_USB_DEVICE{ 0xA5DCBF10, 0x6530, 0x11D2,{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } },// GUID_DEVINTERFACE_HID, { 0x4D1E55B2, 0xF16F, 0x11CF,{ 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } },
};

上面显示这个窗体关事的设备是USB设备,HID设备。

3,实现 OnDeviceChange 函数,其详细实现步骤有,一,在对应的 xxxdlg.h 文件中加入

afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD_PTR dwData);  二,在xxxdlg.cpp 文件中实现 OnDeviceChange 函数功能:

PDEV_BROADCAST_DEVICEINTERFACE pdbi;
PDEV_BROADCAST_PORT dhr;
DEV_BROADCAST_DEVICEINTERFACE* dbd;//设备状态改变时的处理函数BOOL CServoTestDlg::OnDeviceChange(UINT nEventType, DWORD_PTR dwData){dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData;//dwData是一个指向DEV_BROADCAST_DEVICEINTERFACE结构体的指针,//在该结构体中保存了设备的类型、路径名等参数。通过跟我们指定设备//的路径名比较,即可以判断是否是我们指定的设备拔下或者插入了。pdbi = (PDEV_BROADCAST_DEVICEINTERFACE)dwData;dhr  = (PDEV_BROADCAST_PORT )dwData;switch (nEventType) //参数nEventType中保存着事件的类型{//设备连接事件case DBT_DEVICEARRIVAL:if (pdbi->dbcc_devicetype == DBT_DEVTYP_DEVICEINTERFACE){PDEV_BROADCAST_PORT lpdbv = (PDEV_BROADCAST_PORT)dhr;CString name(lpdbv->dbcp_name); if ( name.Find(L"VID_0483") &&  name.Find(L"PID_5740") ){// OnBnClickedConnectDevice();  // 插入后在操作}}return TRUE;// 设备拔出事件case DBT_DEVICEREMOVECOMPLETE:if (pdbi->dbcc_devicetype == DBT_DEVTYP_DEVICEINTERFACE){PDEV_BROADCAST_PORT lpdbv = (PDEV_BROADCAST_PORT)dhr;CString name(lpdbv->dbcp_name);if ( name.Find(L"VID_0483") &&  name.Find(L"PID_5740") ){if (IsDeviceOpened == TRUE ){// OnBnClickedReleaseDevice(); // 拔出后的操作}}}return TRUE;default: return TRUE;}}

上面的代码加入了对usb 设备的VID 与 PID的判定,以确定是否是所关心的设备的插入/拔出。

实现以上三步,就可以实现设备的热插拔功能了!!

mfc 实现 设备 热插拔功能相关推荐

  1. 【音视频】在SDK中集成windows视音频设备热插拔功能(5-2)

    上一篇实现了windows的音视频设备热插拔功能,这一篇集成到SDK中.我的对外接口类是HCMDesktopRecorder,该篇主要讲如何集成热插拔功能,其他代码忽略. 1.开启并注册热插拔 int ...

  2. Vmware Workstation 6.5试用之二—支持设备的热插拔功能

    Vmware Workstation 6.5试用之二-支持设备的热插拔功能 在Vmware Workstation 6.5中,如果虚拟机硬件是6.5的格式,在Windows XP.Windows Se ...

  3. 在 ESXi 6.x和5.x虚拟机中禁用热添加/热插拔功能

    现象: 网卡和 SCSI 控制器显示为可移除设备. 与该虚拟硬件对应的"安全移除硬件"选项显示在 Windows 系统任务栏中. 如果正在使用 VMware View,您会注意到具 ...

  4. PCIe SSD之SFF-8639和备受关注的热插拔功能

    SFF(Small Form Factor)硬盘一般特指服务器或盘柜中使用的2.5英寸硬盘.服务器和盘柜使用它的目的是为了提高单位容积内的存储密度,降低热量和功耗,SFF对应的是LFF,3.5英寸硬盘 ...

  5. 去除MFC窗口的自动记忆功能

    参考链接:如何去除MFC窗口的自动记忆功能 程序开始函数:CmyApp::InitInstance 程序结束函数:CmyApp::ExitInstance 加入代码: BOOL CmyApp::Ini ...

  6. 【MFC】具有提示功能的工具栏

    00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 在文档\视图结构的应用 ...

  7. StratoVirt 中的 PCI 设备热插拔实现

    热插拔即带电插拔,在虚拟化场景下,热插拔就是在虚拟机运行过程中对磁盘网卡等设备进行动态调整. 常见的热插拔机制有 ACPI 机制的热插拔,PCIe-Native 机制的热插拔.ACPI 机制的热插拔依 ...

  8. MFC实现像素鸟功能和一些改进

    MFC实现像素鸟功能和一些改进 暑期实训要求用MFC来实现像素鸟功能和一些特别的功能(比如生命值加血道具之类的),经过5天的不懈努力终于完成了,写在这里留作纪念,供大家参考与学习.缺点就是代码没有封装 ...

  9. 开源项目推荐:C++/MFC/Qt开发的功能齐全的屏幕截图软件ScreenCatch/Snipaste

    声明:项目非本人原创,仅仅分享链接! 声明:项目非本人原创,仅仅分享链接! 声明:项目非本人原创,仅仅分享链接! ScreenCatch(基于MFC) 详情参见 功能齐全的屏幕截图C++实现详解_ch ...

最新文章

  1. 在spoc上安装linux系统,郁闷,HACMP的C-SPOC没办法用
  2. 在Ubuntu 14.04.5 64bit上安装git GUI客户端GitKraken
  3. linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...
  4. 菜鸟教程:SQL 通用数据类型
  5. oracle查看和替换含不可见字符(空白)
  6. 从CNNIC的“中国互联网报告”看到希望
  7. 如何在Chrome浏览器中创建账户?
  8. 磁力mysql搜索_多功能搜索 搜索系统安装 小说 电影 磁力
  9. vnpy学习11_增加测试评估指标
  10. 解决Navicat无法连接到MySQL的问题
  11. c语言自学教材百度网盘,110G超强C语言和C++编程0基础从入门到精通自学教程 百度云盘资源...
  12. TortoiseHg笔记
  13. 多玩我的世界盒子手机版怎么联机?我的世界盒子电脑版怎么联机?
  14. NB-loT中的Niubility技术
  15. keras 多输入多输出网络
  16. 高效程序员系列 别做机器人——让工作自动化
  17. 获取MAC端当前系统语言
  18. 百度大脑 iOCR助力物流行业智能化管理案例
  19. 论面向服务的架构及其应用
  20. MySQL按顿号拆分列为多行

热门文章

  1. java 获取微信公众号code为空
  2. 每日一九度之 题目1083:特殊乘法
  3. 五小步让VS Code支持AngularJS智能提示
  4. static方法与非static方法是否可以互相调用
  5. 移动端代码规范小结(一)
  6. [原创] SQLite数据库使用清单(上)
  7. 转:a标签中如果有button, 那么在IE下就不能跳转到herf的链接
  8. Codeforces Round #297 (Div. 2)C. Ilya and Sticks 贪心
  9. 【Nutch2.2.1基础教程之2.1】集成Nutch/Hbase/Solr构建搜索引擎之一:安装及运行【单机环境】...
  10. [转]ASP.NET中常用的文件上传下载方法