概述
利用usb设备的一些固定信息,比如PID,VID检测指定USB设备或者所有USB设备的插入与拔出状态。
注意添加头文件
#include <Dbt.h> //结构体定义,消息等
实现方法
1.首先在消息处理中添加消息WM_DEVICECHANGE
case WM_DEVICECHANGE:
DeviceChange(wParam,lParam);
break;
DeviceChange(wParam,lParam)函数
//Usb设备插拔检测
void CMainFrame::DeviceChange(WPARAM wParam, LPARAM lParam)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;
switch (wParam)
{
case DBT_DEVICEARRIVAL://设备插入
//只检测指定PID与VID的设备
switch (pHdr->dbch_devicetype)
{
case DBT_DEVTYP_DEVICEINTERFACE:
PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
wstring wstr = pDevInf->dbcc_name;
int Resultone = wstr.find(_T("0983"));
int Resulttwo = wstr.find(_T("5910"));
if (Resultone > 0 && Resulttwo>0)
{
m_Usb->InitUsb();
SetUsbStatus(true);
}
break;
}
//检测所有usb设备
/*m_Usb->InitUsb();
SetUsbStatus(true);*/
break;
case DBT_DEVICEREMOVECOMPLETE://设备拔出
//只检测指定PID与VID的设备
switch (pHdr->dbch_devicetype)
{
case DBT_DEVTYP_DEVICEINTERFACE:
PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
wstring wstr = pDevInf->dbcc_name;
int Resultone = wstr.find(_T("0983"));
int Resulttwo = wstr.find(_T("5910"));
if (Resultone > 0 && Resulttwo > 0)
{
m_Usb->CloseUsb();
SetUsbStatus(false);
}
break;
}
//检测所有usb设备
/*m_Usb->CloseUsb();
SetUsbStatus(false);*/
break;
default:
break;
}
}
2.在程序初始化时注册USB设备
//本机注册USB信息
void CMainFrame::RegisterUsb()
{
//注册USB变动信息以响应WM_DEVICECHANGE消息检测USB热插拔
//static const GUID x_guid = { 0x745A17A0,0x74D3,0x11D0,0xb6FE,0x00,0XA,0x0C,0x90,0xF5,0x7DA };
DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
memset(&DevBroadcastDeviceInterface, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
DevBroadcastDeviceInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
//DevBroadcastDeviceInterface.dbcc_classguid = x_guid;
RegisterDeviceNotification(this->GetHWND(), &DevBroadcastDeviceInterface, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
}