windows下USB检测插拔状态

概述

利用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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值