USB 每次插入拔出,nEventType总是返回7
static
const
GUID GUID_DEVINTERFACE_LIST[] =
{
// GUID_DEVINTERFACE_USB_DEVICE
{ 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } },
// GUID_DEVINTERFACE_DISK
{ 0x53f56307, 0xb6bf, 0x11d0, { 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } },
// GUID_DEVINTERFACE_HID,
{ 0x4D1E55B2, 0xF16F, 0x11CF, { 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } },
// GUID_NDIS_LAN_CLASS
{ 0xad498944, 0x762f, 0x11d0, { 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c } }
};
//注册插拔事件
HDEVNOTIFY hDevNotify;
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory( &NotificationFilter,
sizeof
(NotificationFilter) );
NotificationFilter.dbcc_size =
sizeof
(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
for
(
int
i=0; i<
sizeof
(GUID_DEVINTERFACE_LIST)/
sizeof
(GUID); i++)
{
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];
hDevNotify = RegisterDeviceNotification(
this
->GetSafeHwnd(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
if
( !hDevNotify )
{
return
FALSE;
}
}
OnDeviceChange(UINTnEventType, DWORD dwData)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)dwData;
char cDrive;
TRACE("OnDeviceChange: %u\n",nEventType);
switch(nEventType)
{
case DBT_DEVICEARRIVAL:
TRACE("OnDeviceChange: DBT_DEVICEARRIVAL\n");
if(DBT_DEVTYP_VOLUME == lpdb->dbch_devicetype)
{
//Logical volume has been inserted and becomes available
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if(0 == lpdbv->dbcv_flags)
{
cDrive = FirstDriveFromMask(lpdbv->dbcv_unitmask);
RemovableDiskArrival(cDrive);
}
}
break;
case DBT_DEVICEQUERYREMOVE:
break;
case DBT_DEVICEQUERYREMOVEFAILED:
break;
case DBT_DEVICEREMOVEPENDING:
break;
case DBT_DEVICEREMOVECOMPLETE:
TRACE("OnDeviceChange:DBT_DEVICEREMOVECOMPLETE\n");
if(DBT_DEVTYP_VOLUME == lpdb->dbch_devicetype)
{
//Logical volume has been physically removed
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if(0 == lpdbv->dbcv_flags)
{
TRACE("OnDeviceChange: DBT_DEVICEREMOVECOMPLETERefreshTree\n");
cDrive = FirstDriveFromMask(lpdbv->dbcv_unitmask);
RemovableDiskRemove(cDrive);
}
}
break;
case DBT_DEVICETYPESPECIFIC:
break;
case DBT_CONFIGCHANGED:
break;
case DBT_DEVNODES_CHANGED:
break;
}
return TRUE;
}
将消息添加到消息map表中
BEGIN_MESSAGE_MAP(CAutoDownDlg,CDialog)
ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()