添加 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)