Qt MFC支持USB设备热插拔
来源:互联网 发布:淘宝冻结资金 编辑:程序博客网 时间:2024/06/05 00:49
一.某MFC开发代码:
BEGIN_MESSAGE_MAP(CHWDetectDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_DEVICECHANGE, OnMyDeviceChange)
//}}AFX_MSG_MAP
ON_WM_CONTEXTMENU()
ON_COMMAND(ID_POPUP_DISABLE, OnPopupDisable)
END_MESSAGE_MAP()
//-----------处理函数---------------
LRESULT CHWDetectDlg::OnMyDeviceChange(WPARAM wParam, LPARAM lParam)
{
if ( DBT_DEVICEARRIVAL == wParam || DBT_DEVICEREMOVECOMPLETE == wParam ) {
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;
PDEV_BROADCAST_DEVICEINTERFACE pDevInf;
PDEV_BROADCAST_HANDLE pDevHnd;
PDEV_BROADCAST_OEM pDevOem;
PDEV_BROADCAST_PORT pDevPort;
PDEV_BROADCAST_VOLUME pDevVolume;
switch( pHdr->dbch_devicetype ) {
case DBT_DEVTYP_DEVICEINTERFACE:
pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
UpdateDevice(pDevInf, wParam);
break;
case DBT_DEVTYP_HANDLE:
pDevHnd = (PDEV_BROADCAST_HANDLE)pHdr;
break;
case DBT_DEVTYP_OEM:
pDevOem = (PDEV_BROADCAST_OEM)pHdr;
break;
case DBT_DEVTYP_PORT:
pDevPort = (PDEV_BROADCAST_PORT)pHdr;
break;
case DBT_DEVTYP_VOLUME:
pDevVolume = (PDEV_BROADCAST_VOLUME)pHdr;
break;
}
}
return 0;
}
二.说明
WM_DEVICECHANGE的使用方式有二種,一種是透過WindowProc()的方式,一種是直接在程式裡加上OnDeviceChange()的函數,底下就先介紹第二種方式。
1. 新增消息 -- 在Dialog的.cpp裡加上藍色部份:
BEGIN_MESSAGE_MAP(CDeviceMonitorDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()
注意:不添加新增消息,就不能响应OnDeviceChange函数
2.新增一個函數 -- 這是Microsoft所提供的函數型態
DECLARE_MESSAGE_MAP()
public:
afx_msg BOOL OnDeviceChange(UINT nEventType,DWORD_PTR dwData);
3.函数內容的实现
下面是以USB插入响应为例
BOOL CCLMemTestDlg::OnDeviceChange( UINT nEventType, DWORD_PTR dwData )
{
switch(nEventType)
{
case DBT_DEVICEARRIVAL:
UpdateUsbDeviceList();
break;
case DBT_DEVICEREMOVECOMPLETE:
UpdateUsbDeviceList();
UpdateWindow();
break;
}
return TRUE;
}
三.
串口热拔插监听
关于串口热拔插监听,请更多地参考
《Qt中捕获Windows消息》
《USB转串口突然拔出检测解决方案》
《USB设备监控深入分析》
代码
- #include <dbt.h>
- bool WndTest::winEvent( MSG * message, long * result )
- {
- if( WM_DEVICECHANGE == message->message ){
- }
- else
- goto ev_out;
-
- if( 0x8004 == message->wParam ){
- DEV_BROADCAST_PORT *vol = (DEV_BROADCAST_PORT*)message->lParam;
- QString str = QString::fromWCharArray(vol->dbcp_name); //获取要处理的串口名称
- if( 3 != vol->dbcp_devicetype )
- goto ev_out;
-
- if( m_serial ){
- if( str.size() > 0 ){
- if( str.compare(cbComPort->currentText()) ==0 && m_connected ){ //比较串口名称,判定是否为当前使用的串口
- closeport(); //关闭串口
- qDebug()<<"close port:"<<str;
- }
- }
- }
- }
- if( 0x8000 == message->wParam ){
- DEV_BROADCAST_PORT * vol = (DEV_BROADCAST_PORT*)message->lParam; //DEV_BROADCAST_VOLUME
- QString str = QString::fromWCharArray(vol->dbcp_name);
- if( str.size() > 0 ){
- qDebug()<<"to open port:"<<str; //在DEBUG信息中输出要处理的串口名称
- }
-
- }
- ev_out:
- return false;
- }
- Qt MFC支持USB设备热插拔
- 配置虚拟机支持USB设备的热插拔
- MFC 枚举USB设备
- mini2440 usb设备支持
- Qt上USB设备热插拔检测
- ESX 4支持USB设备
- Virtualbox 启用USB 设备支持
- Virtualbox 启用USB 设备支持
- MFC 检测USB接口设备连接变化
- Linux下命令行支持USB设备
- 为virtualbox开启usb设备支持(zhuanzai )
- 让虚拟机软件能支持USB设备启动
- Android平台中MCE USB设备支持
- Ubuntu 15.04启动Virtualbox USB 设备支持
- 如何配置内核,以支持USB设备。
- QT 监听 USB 设备 插入、拔出动作
- Qt同时支持触摸屏和USB鼠标
- MFC检测USB热插拔
- 关于c++显示调用析构函数的陷阱
- linux ls和 ll 命令的区别
- 移植Conkiti内核到LPC11U14上
- fully connected layer as 1x1 convolution
- TortoiseGit&Git安装及教程
- Qt MFC支持USB设备热插拔
- [dp]最长递增子序列poj 1631Bridging signals
- 第2周项目1--c/c++语言中函数参数传递的三种方式
- Fast Radial Symmetry Transform/快速径向对称变换
- 【WPF】—StackPanel && Grid 初识布局容器(1)
- select、poll、epoll之间的区别总结[整理]
- eclipse 版本 代号 svn
- Fast Radial Symmetry Transform/快速径向对称变换(代码)
- MATLAB中的diag函数