文章目录
Step 1: 创建MFC程序
Step 2: 消息处理成员函数声明
MFCApplication1Dlg.h 中添加一行:
class CMFCApplication1Dlg : public CDialogEx
{
// 构造
public:
CMFCApplication1Dlg(CWnd* pParent = nullptr); // 标准构造函数
//LRESULT CU_disk_detection_scanningDlg::WindowProc(UINT message, WPARAM wparam, LPARAM lparam);
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MFCAPPLICATION1_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
LRESULT OnMyDeviceChange(WPARAM wParam, LPARAM lParam); /!!! 添加的声明
Step 3: 添加一行消息映射:
在 MFCApplication1Dlg.cpp 文件中添加一行 ON_MESSAGE(WM_DEVICECHANGE, OnMyDeviceChange)
BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_DEVICECHANGE, OnMyDeviceChange) !!!! 添加的行
END_MESSAGE_MAP()
Step 4: 添加其他函数和消息处理函数:
在 MFCApplication1Dlg.cpp 中添加其他函数和消息处理函数:
char FirstDriveFromMask(ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}
LRESULT CMFCApplication1Dlg::OnMyDeviceChange(WPARAM wParam, LPARAM lParam)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
switch (wParam)
{
case WM_DEVICECHANGE:
break;
case DBT_DEVICEARRIVAL://DBT_DEVICEARRIVAL,设备检测结束,并且可以使用
{
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
switch (lpdbv->dbcv_flags)
{
case 0: //U盘
{
std::string sPlugMsg("检测到U盘: [");
sPlugMsg += FirstDriveFromMask(lpdbv->dbcv_unitmask);
sPlugMsg += "] 插入!";
SetDlgItemText(IDC_EDIT1, sPlugMsg.c_str());
}
break;
case DBTF_MEDIA: //光盘
std::string sCDMsg("检测到光盘:[");
sCDMsg += FirstDriveFromMask(lpdbv->dbcv_unitmask);
sCDMsg += "] 插入!";
SetDlgItemText(IDC_EDIT1, sCDMsg.c_str());
break;
}
}
}
break;
case DBT_DEVICEREMOVECOMPLETE://DBT_DEVICEREMOVECOMPLETE,设备卸载或者拔出
{
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
switch (lpdbv->dbcv_flags)
{
case 0: //U盘
{
std::string sUnplugMsg("检测到U盘: [");
sUnplugMsg += FirstDriveFromMask(lpdbv->dbcv_unitmask);
sUnplugMsg += "] 拔出!";
SetDlgItemText(IDC_EDIT1, sUnplugMsg.c_str());
}
break;
case DBTF_MEDIA: //光盘
std::string sCDMsg("检测到光盘:[");
sCDMsg += FirstDriveFromMask(lpdbv->dbcv_unitmask);
sCDMsg += "] 插入!";
SetDlgItemText(IDC_EDIT1, sCDMsg.c_str());
break;
}
}
}
break;
}
return 0;
}
Step 5. 其他
5.1 修改项目属性,改为使用多字节字符集
5.2 MFCApplication1Dlg.cpp 增加头文件
#include <string>
5.3 其他头文件
#include<dbt>
#include<winioct1>
#include<windows> // 这个可能不需要加,对于MFC
*** 注意 CMFCApplication1Dlg 很可能要相应修改 !不是所有的项目都一样的名称***
使用 VS2017 运行结果示意图:
这个程序并不够完善,但是可以跑起来了。
========================