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

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;  
}


  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MFC(Microsoft Foundation Classes)是微软公司为了简化Windows编程而开发的一套C++类库。实现USB热插意味着在程序运行时,可以在不重启计算机的情况下插入USB设备,并能够正常识别和操作该设备。 要实现MFC中的USB热插功能,可以通过以下步骤进行: 1. 导入相关头文件:在MFC程序中,需要引入相关的头文件,例如"afxwin.h"、"usb100.h"等。 2. 初始化USB驱动程序:在程序启动时,需要初始化USB驱动程序,可以通过调用CreateFile函数打开USB设备句柄,并设置参数。 3. 监测USB事件:使用MFC的消息循环机制,通过设置WM_DEVICECHANGE消息来监测USB设备的插事件。可以通过重载MFC的消息处理函数来处理WM_DEVICECHANGE消息。 4. 处理USB事件:当收到WM_DEVICECHANGE消息时,可以通过DeviceNotify回调函数获取USB设备的状态,例如插入还是。根据需要,可以执行特定的操作,例如打开设备、读取设备信息、发送数据等。 5. 完成USB设备的初始化和关闭:在处理USB事件时,需要根据设备插入状态,进行相应的初始化和关闭操作。当USB设备插入时,可以打开设备句柄,读取设备信息并进行相关处理;当USB设备时,需要关闭设备句柄并释放资源。 总之,通过MFC编程可以实现USB热插功能。需要注意的是,具体实现过程可能需要根据不同的USB设备和驱动程序进行调整,同时还需要对MFC消息处理和USB编程有一定的理解和经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值