头文件包含:
#include <WTypes.h>
#include <dbt.h>
#include <Windows.h>
重写QDialog的winEvent函数:
bool CMainWin::winEvent(MSG *message, long *result)
{
switch(message->message)
{
case WM_DEVICECHANGE:
{
switch (message->wParam)
{
case WM_DEVICECHANGE:
break;
case DBT_DEVICEARRIVAL: //U盘插入
{
PDEV_BROADCAST_HDR lpdb =
(PDEV_BROADCAST_HDR)message->lParam;
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if ((lpdbv->dbcv_flags & DBTF_MEDIA) == 0)
{
char bChar = mcGetDriveName(lpdbv->dbcv_unitmask);
QString strUsbDrive;
strUsbDrive.sprintf("%c:/", bChar);
// 发出“发现可移动磁盘”信号
emit msigFindNewUsb(strUsbDrive);
}
}
break;
}
case DBT_CONFIGCHANGECANCELED:
break;
case DBT_CONFIGCHANGED:
break;
case DBT_CUSTOMEVENT:
break;
case DBT_DEVICEQUERYREMOVE:
break;
case DBT_DEVICEQUERYREMOVEFAILED:
break;
case DBT_DEVICEREMOVECOMPLETE: //U盘卸载
{
PDEV_BROADCAST_HDR lpdb =
(PDEV_BROADCAST_HDR)message->lParam;
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if ((lpdbv->dbcv_flags & DBTF_MEDIA) == 0)
{
char bChar = mcGetDriveName(lpdbv->dbcv_unitmask);
QString strUsbDrive;
strUsbDrive.sprintf("%c:/", bChar);
// 发出“发现可移动磁盘”信号
emit msigUsbUninstalled(strUsbDrive);
}
}
break;
}
case DBT_DEVICEREMOVEPENDING:
break;
case DBT_DEVICETYPESPECIFIC:
break;
case DBT_DEVNODES_CHANGED:
break;
case DBT_QUERYCHANGECONFIG:
break;
case DBT_USERDEFINED:
break;
default:
break;
}
break;
}
default:
break;
}
return false;
}