mfc 实现 设备 热插拔功能
开发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 实现 设备 热插拔功能相关推荐
- 【音视频】在SDK中集成windows视音频设备热插拔功能(5-2)
上一篇实现了windows的音视频设备热插拔功能,这一篇集成到SDK中.我的对外接口类是HCMDesktopRecorder,该篇主要讲如何集成热插拔功能,其他代码忽略. 1.开启并注册热插拔 int ...
- Vmware Workstation 6.5试用之二—支持设备的热插拔功能
Vmware Workstation 6.5试用之二-支持设备的热插拔功能 在Vmware Workstation 6.5中,如果虚拟机硬件是6.5的格式,在Windows XP.Windows Se ...
- 在 ESXi 6.x和5.x虚拟机中禁用热添加/热插拔功能
现象: 网卡和 SCSI 控制器显示为可移除设备. 与该虚拟硬件对应的"安全移除硬件"选项显示在 Windows 系统任务栏中. 如果正在使用 VMware View,您会注意到具 ...
- PCIe SSD之SFF-8639和备受关注的热插拔功能
SFF(Small Form Factor)硬盘一般特指服务器或盘柜中使用的2.5英寸硬盘.服务器和盘柜使用它的目的是为了提高单位容积内的存储密度,降低热量和功耗,SFF对应的是LFF,3.5英寸硬盘 ...
- 去除MFC窗口的自动记忆功能
参考链接:如何去除MFC窗口的自动记忆功能 程序开始函数:CmyApp::InitInstance 程序结束函数:CmyApp::ExitInstance 加入代码: BOOL CmyApp::Ini ...
- 【MFC】具有提示功能的工具栏
00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 在文档\视图结构的应用 ...
- StratoVirt 中的 PCI 设备热插拔实现
热插拔即带电插拔,在虚拟化场景下,热插拔就是在虚拟机运行过程中对磁盘网卡等设备进行动态调整. 常见的热插拔机制有 ACPI 机制的热插拔,PCIe-Native 机制的热插拔.ACPI 机制的热插拔依 ...
- MFC实现像素鸟功能和一些改进
MFC实现像素鸟功能和一些改进 暑期实训要求用MFC来实现像素鸟功能和一些特别的功能(比如生命值加血道具之类的),经过5天的不懈努力终于完成了,写在这里留作纪念,供大家参考与学习.缺点就是代码没有封装 ...
- 开源项目推荐:C++/MFC/Qt开发的功能齐全的屏幕截图软件ScreenCatch/Snipaste
声明:项目非本人原创,仅仅分享链接! 声明:项目非本人原创,仅仅分享链接! 声明:项目非本人原创,仅仅分享链接! ScreenCatch(基于MFC) 详情参见 功能齐全的屏幕截图C++实现详解_ch ...
最新文章
- 在spoc上安装linux系统,郁闷,HACMP的C-SPOC没办法用
- 在Ubuntu 14.04.5 64bit上安装git GUI客户端GitKraken
- linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...
- 菜鸟教程:SQL 通用数据类型
- oracle查看和替换含不可见字符(空白)
- 从CNNIC的“中国互联网报告”看到希望
- 如何在Chrome浏览器中创建账户?
- 磁力mysql搜索_多功能搜索 搜索系统安装 小说 电影 磁力
- vnpy学习11_增加测试评估指标
- 解决Navicat无法连接到MySQL的问题
- c语言自学教材百度网盘,110G超强C语言和C++编程0基础从入门到精通自学教程 百度云盘资源...
- TortoiseHg笔记
- 多玩我的世界盒子手机版怎么联机?我的世界盒子电脑版怎么联机?
- NB-loT中的Niubility技术
- keras 多输入多输出网络
- 高效程序员系列 别做机器人——让工作自动化
- 获取MAC端当前系统语言
- 百度大脑 iOCR助力物流行业智能化管理案例
- 论面向服务的架构及其应用
- MySQL按顿号拆分列为多行
热门文章
- java 获取微信公众号code为空
- 每日一九度之 题目1083:特殊乘法
- 五小步让VS Code支持AngularJS智能提示
- static方法与非static方法是否可以互相调用
- 移动端代码规范小结(一)
- [原创] SQLite数据库使用清单(上)
- 转:a标签中如果有button, 那么在IE下就不能跳转到herf的链接
- Codeforces Round #297 (Div. 2)C. Ilya and Sticks 贪心
- 【Nutch2.2.1基础教程之2.1】集成Nutch/Hbase/Solr构建搜索引擎之一:安装及运行【单机环境】...
- [转]ASP.NET中常用的文件上传下载方法