- 在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()中间添加消息映射ON_WM_DEVICECHANGE()。
BEGIN_MESSAGE_MAP(CMAINDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()
2.添加并实现消息映射函数。
#include <windows.h>
#include <dbt.h>
#include <strsafe.h>
#pragma comment(lib, "user32.lib" )
BOOL OnDeviceChange(UINT nEventType, DWORD dwData);
char FirstDriveFromMask( ULONG unitmask );
BOOL CMAINDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
{
CString detectMsg;
// 用作与通过WM_DEVICECHANGE消息报告的设备事件相关信息的标准头
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)dwData;
// nEventType:相当于wParam
switch (nEventType)
{
case DBT_DEVICEREMOVECOMPLETE:
// 设备卸载或者拔出
{
// 判断当前USB设备是否是逻辑卷
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
//逻辑卷
{
// 包含有关逻辑卷的信息
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
// 判断当前逻辑卷的类型
switch (lpdbv->dbcv_flags)
{
case 0:
//U盘
{
// 输出U盘的拔插信息
CString decDriver;
decDriver = FirstDriveFromMask(lpdbv->dbcv_unitmask);
detectMsg.Format(_T("检测到U盘:[%s]拔出!"), decDriver.GetBuffer());
decDriver.ReleaseBuffer();
MessageBox(detectMsg);
}
break;
case DBTF_MEDIA:
//光盘
break;
}
}
}
break;
case DBT_DEVICEARRIVAL:
// 系统检测到新设备
{
//逻辑卷
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
switch (lpdbv->dbcv_flags)
{
case 0:
{
//U盘
CString decDriver;
decDriver = FirstDriveFromMask(lpdbv->dbcv_unitmask);
detectMsg.Format(_T("检测到U盘:[%s]插入!"), decDriver.GetBuffer());
decDriver.ReleaseBuffer();
MessageBox(detectMsg);
}
break;
case DBTF_MEDIA:
//光盘
break;
}
}
}
break;
}
return TRUE;
}
char CMAINDlg::FirstDriveFromMask( ULONG unitmask )
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return( i + 'A' );
}
参考文档:检测媒体插入或删除 、处理WM_DEVICECHANGE消息