MFC USB detecting

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 运行结果示意图:

这个程序并不够完善,但是可以跑起来了。
在这里插入图片描述

========================
在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值