获取USB设备信息的方式介绍_第1页
获取USB设备信息的方式介绍_第2页
获取USB设备信息的方式介绍_第3页
获取USB设备信息的方式介绍_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

获取USB设备信息的方式介绍1需求描述实现USB设备的热插拔状态检测;可识别USB设备信息,例如PID、VID、设备序列号等。2设计思路2.1获取USB设备信息的方式?经过查询,Qt可通过本地事件获取到设备相关信息,用到的的事件函数原型为:boolQWidget::nativeEvent(constQByteArray&eventType,void*message,long*result)官方说明:这个特殊的事件处理程序可以在子类中重新实现,以接收在消息参数中传递的由eventType标识的本机平台事件。在这个函数的重新实现中,如果您想要停止Qt正在处理的事件,请返回true并设置result,结果参数仅在Windows上有意义。如果返回false,此本机事件将被传递回Qt,Qt将该事件转换为Qt事件并将其发送给窗口。注意:只有当窗口具有本地窗口句柄时,事件才会交付给此事件处理程序。很容易理解吧,对于widget窗口而言,这个事件是源头,Qt封装好的事件都从这里来,如果直接返回true界面将无法显示,有兴趣的朋友可以试试。另外,发现没有这个事件是QWidget的,所以只有窗口界面才有,窗口的句柄可以通过QWidget::winId获取到,这个后面注册设备时会用到。2.2准备工作?如果只是重写nativeEvent是不够的,并不能获取到设备信息,只能识别热插拔状态。要识别USB设备信息需要用到GUID,先定义设备的GUID,再注册设备,注册完成后才能获取对应设备的本地事件,从而通过事件获取到设备信息。GUID(全称:GloballyUniqueIdentifier)全局唯一标识符,在windows上使用GUID来管理设备,驱动,总线,类型,块设备,电源等。2.3常用硬件设备GUID

IdentifierClassGUIDGUID_DEVINTERFACE_USB_DEVICE{A5DCBF10-6530-11D2-901F-00C04FB951ED}GUID_DEVINTERFACE_USB_HOST_CONTROLLER{A5DCBF10-6530-11D2-901F-00C04FB951ED}GUID_DEVINTERFACE_USB_HUB{F18A0E88-C30C-11D0-8815-00A0C906BED8}GUID_DEVINTERFACE_NET{CAC88484-7515-4C03-82E6-71A87ABAC361}GUID_DEVINTERFACE_DISK{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}GUID_DEVINTERFACE_CDROM{53F56308-B6BF-11D0-94F2-00A0C91EFB8B}GUID_DEVINTERFACE_KEYBOARD{884B96C3-56EF-11D1-BC8C-00A0C91405DD}GUID_DEVINTERFACE_MOUSE{378DE44C-56EF-11D1-BC8C-00A0C91405DD}GUID_DEVINTERFACE_IMAGE{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}GUID_BTHPORT_DEVICE_INTERFACE{0850302A-B344-4fda-9BE9-90576B8D46F0}太多了,网上可以搜到,这里就不一一列出。

3代码实现windows提供了接口向系统注册设备,注册后当有U盘插拔(或其它volume增删)的时候,会向注册的窗口发送WM_DEVICECHANGE消息:

HDEVNOTIFYWINAPIRegisterDeviceNotification(

__inHANDLEhRecipient,//可以是窗口句柄或者服务句柄

__inLPVOIDNotificationFilter,

__inDWORDFlags//制定hRecipient是窗口句柄,还是服务句柄

);先注册设备,这样才能接收到消息,代码如下:

voidDialog::registerDevice(){constGUIDGUID_DEVINTERFACE_LIST[]={{0xA5DCBF10,0x6530,0x11D2,{0x90,0x1F,0x00,0xC0,0x4F,0xB9,0x51,0xED}},//USB设备的GUID{0x53f56307,0xb6bf,0x11d0,{0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b}}};HDEVNOTIFYhDevNotify;DEV_BROADCAST_DEVICEINTERFACENotifacationFiler;ZeroMemory(&NotifacationFiler,sizeof(DEV_BROADCAST_DEVICEINTERFACE));NotifacationFiler.dbcc_size=sizeof(DEV_BROADCAST_DEVICEINTERFACE);NotifacationFiler.dbcc_devicetype=DBT_DEVTYP_DEVICEINTERFACE;for(inti=0;i<sizeof(GUID_DEVINTERFACE_LIST)/sizeof(GUID);i++){NotifacationFiler.dbcc_classguid=GUID_DEVINTERFACE_LIST[i];hDevNotify=RegisterDeviceNotification((HANDLE)this->winId(),&NotifacationFiler,DEVICE_NOTIFY_WINDOW_HANDLE);if(!hDevNotify){qCritical()<<QStringLiteral("注册失败!");}}}

通过本地事件获取消息并解析,代码如下:

boolDialog::nativeEvent(constQByteArray&eventType,void*message,long*result){Q_UNUSED(eventType);Q_UNUSED(result);MSG*msg=reinterpret_cast(message);intmsgType=msg->message;if(WM_DEVICECHANGE==msgType){PDEV_BROADCAST_HDRlpdb=(PDEV_BROADCAST_HDR)msg->lParam;switch(msg->wParam){caseDBT_DEVICEARRIVAL:{if(DBT_DEVTYP_VOLUME==lpdb->dbch_devicetype){PDEV_BROADCAST_VOLUMElpdbv=(PDEV_BROADCAST_VOLUME)lpdb;if(0==lpdbv->dbcv_flags){//优盘

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论