MFC 检测USB接口设备连接变化

添加 WM_DEVICECHANGE 消息

afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD_PTR dwData);

BEGIN_MESSAGE_MAP(Cwndclass, Cbaseclass)
ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()


// 获取盘符

LONG Cwndclass::JudgeDeviceLetter( LONG nFlags )
{
int i;
for( i = 0; i < 26; i ++ )
{
if( nFlags & 1 )
break;
nFlags = nFlags >> 1;
}
return i + 'A';
}

BOOL Cwndclass::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
{
DEV_BROADCAST_VOLUME*pDevVolume = (DEV_BROADCAST_VOLUME*)dwData;
if( nEventType != DBT_DEVICEARRIVAL )
return TRUE;

if( pDevVolume->dbcv_devicetype != DBT_DEVTYP_VOLUME )
return TRUE;

TCHAR szRootPathName[MAX_PATH];
TCHAR szScanDisk[MAX_PATH] = {0};
DWORD dwDisk = 0;
UINT uDrvType = 0;
int nDisk = JudgeDeviceLetter(pDevVolume->dbcv_unitmask);

_sntprintf_s(szRootPathName, MAX_PATH, _T("%c:\\"), nDisk);
uDrvType = GetDriveType(szRootPathName);

if(DRIVE_REMOVABLE != uDrvType)
return TRUE;

if(DRIVE_UNKNOWN == uDrvType || DRIVE_NO_ROOT_DIR == uDrvType || DRIVE_CDROM == uDrvType)
return TRUE;

return TRUE;
}



//Windows设备管理器在改变设备状态后会广播一个自注册的消息。
//其格式为"DevMgrRefreshOn"+计算机名;
//我们在收到此消息后刷新设备列表
//注意:最好不用WM_DEVICECHANGE,WM_DEVICECHANGE在改变设备之前已发送,但改变设备可能需要一些时间,
//如果一接收到WM_DEVICECHANGE就更新的话,可能设备改变这一动作还没有做完。
//因此,响应Windows设备管理器自注册更好些。
//由于有些自制安装程序,比如sofeice带的EzDriverInstaller在改变状态后只广播WM_DEVICECHANGE
//最好两种情况综合考虑。
static CString GetDeviceChangedMsg()
{
CString szComputerName;
DWORD dwSize = MAX_PATH;
::GetComputerName(szComputerName.GetBufferSetLength(dwSize),&dwSize);

return "DevMgrRefreshOn"+szComputerName;
}

const UINT WM_DEVICECHANGED = ::RegisterWindowMessage(GetDeviceChangedMsg());


添加自定义消息:

ON_REGISTERED_MESSAGE(WM_DEVICECHANGED,OnDeviceChanged)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值