MFC 如何检测到USB设备插入拔出

本文介绍如何在MFC应用程序中实现USB设备插入和拔出的事件处理。通过注册特定的USB设备,可以监听到设备的变化,并在设备连接或断开时执行相应的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MFC USB设备插入和拔出事件需要使用自定义消息处理,自己添加CODE。


1. 添加消息MAP(也可打开资源视图->类向导->添加消息)

BEGIN_MESSAGE_MAP(CWVKeyAutoWRDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_SIZE()
	ON_BN_CLICKED(IDC_BUTTON_START, &CWVKeyAutoWRDlg::OnBnClickedButtonStart)
	ON_MESSAGE(WM_USER_RUN_COMPLETE, &CWVKeyAutoWRDlg::OnUserRunComplete)
	ON_WM_ACTIVATE()
	ON_WM_DEVICECHANGE() //此消息就是处理设备添加删除
END_MESSAGE_MAP()

2. 消息响应函数声明 *.h文件中

protected:
	afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);

3. 注册USB设备消息,不注册消息处理函数无法响应,只有注册了该设备,OnDeviceChange才能获得详细的信息,否则收到的nEventType参数都是0007,dwData无数据。解决方法://DEVICE_NOTIFY_ALL_INTERFACE_CLASSES //关注所有设备事件 m_hDeviceNotify = RegisterDeviceNotification(this->m_hWnd,&Filter,DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);

代码:

BOOL CWVKeyAutoWRDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

        // 注意
	DEV_BROADCAST_DEVICEINTERFACE Filter;
	ZeroMemory(&Filter,sizeof(Filter));
	Filter.dbcc_size = sizeof(Filter);   // size gets set to 29 with 1-byte packing or 32 with 4- or 8-byte packing
	Filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
	Filter.dbcc_classguid = WceusbshGUID;
	//DEVICE_NOTIFY_ALL_INTERFACE_CLASSES //关注所有设备事件
	m_hDeviceNotify = RegisterDeviceNotification(this->m_hWnd,&Filter,DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
	if(NULL == m_hDeviceNotify)
		TRACE("RegisterDeviceNotification failed!!");



	return TRUE;  //
}

4.  消息处理函数

BOOL CWVKeyAutoWRDlg::OnDeviceChange(UINT nEventType,DWORD dwData)  
{  
	//DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData;
	PDEV_BROADCAST_HDR devHdr;
	PDEV_BROADCAST_DEVICEINTERFACE devInterface;
	switch (nEventType)  
	{  
	case DBT_DEVICEREMOVECOMPLETE://移除设备
		break;
	case DBT_DEVICEARRIVAL://添加设备  
		if (m_bAuto_Flash_wvkey)
		{
			devHdr = (PDEV_BROADCAST_HDR)dwData;
			devInterface = (PDEV_BROADCAST_DEVICEINTERFACE)devHdr;
			if (CheckPidVidByGuid(WceusbshGUID))
				OnStartCallFlashWVKey();

		}
		break;  

	default:  
		break;  
	}  

	return TRUE;  
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值