MFC U盘检测
2024-08-30 04:14:28
WM_DEVICECHANGE消息
查阅MSDN得知:
The framework calls this member function to notify an application or device driver of a change to the hardware configuration of a device or the computer.
即:框架调用这个函数来通知应用程序或者设备驱动程序设备硬件配置或者电脑的配置被改变了。
所以,检测U盘的插入和拔出也就相当于侦测处理WM_DEVICECHANGE消息。
获取WM_DEVICECHANGE消息的方法
WM_DEVICECHANGE的使用方式有两种,一种是通过WindowProc()的方式,另一种是通过OnDeviceChange()消息响应函数的方式,底下就先介紹第一種方式,再介绍第二种。
通过WindowProc()的方式检测U盘
这里通过一个简单的Demo来说明
程序界面如下:
需要包含的头文件:
#include <dbt.h>
#include <winioctl.h>
重写WindowProc()函数实现U盘检测,代码如下:
char FirstDriveFromMask(ULONG unitmask) //獲取盤符
{
char i;
for (i = ; i < ; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> ;
}
return (i + 'A');
} LRESULT CUpanDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
CString detectMsg; switch (message)
{
//WM_DEVICECHANGE,系统硬件改变发出的系统消息
case WM_DEVICECHANGE:
{
PDEV_BROADCAST_HDR lpdb=(PDEV_BROADCAST_HDR)lParam;
switch(wParam)
{
case WM_DEVICECHANGE:
break;
case DBT_DEVICEARRIVAL://设备检测结束,并且可以使用
{
if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
switch(lpdbv->dbcv_flags)
{
case : //U盘
{
CString decDriver;
decDriver = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
detectMsg.Format(_T("检测到U盘:[%s]插入!"), decDriver.GetBuffer());
m_editControl.SetWindowText(detectMsg);
}
break;
case DBTF_MEDIA: //光盘
break;
}
}
}
break;
case DBT_DEVICEREMOVECOMPLETE://设备卸载或者拔出
{
if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
switch(lpdbv->dbcv_flags)
{
case : //U盘
{
CString decDriver;
decDriver = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
detectMsg.Format(_T("检测到U盘:[%s]拔出!"), decDriver.GetBuffer());
m_editControl.SetWindowText(detectMsg);
}
break;
case DBTF_MEDIA: //光盘 break;
}
}
}
break;
}
}
break;
} return CDialog::WindowProc(message, wParam, lParam);
}
程序运行结果如下:
插入U盘时:
拔出U盘时:
2. 通过OnDeviceChange()的方式检测U盘
首先在头文件声明一个消息函数:
afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);
消息映射:
BEGIN_MESSAGE_MAP(OGrgFrmRepair, CDialog) ON_WM_DEVICECHANGE() END_MESSAGE_MAP()
实现:
char FirstDriveFromMask(ULONG unitmask) //獲取盤符
{
char i;
for (i = ; i < ; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> ;
}
return (i + 'A');
} BOOL CUpanDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
{
CString detectMsg;
PDEV_BROADCAST_HDR lpdb=(PDEV_BROADCAST_HDR)dwData; switch (nEventType)
{
case DBT_DEVICEREMOVECOMPLETE:
{
if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
switch(lpdbv->dbcv_flags)
{
case : //U盘
{
CString decDriver;
decDriver = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
detectMsg.Format(_T("检测到U盘:[%s]拔出!"), decDriver.GetBuffer());
m_editControl.SetWindowText(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 : //U盘
{
CString decDriver;
decDriver = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
detectMsg.Format(_T("检测到U盘:[%s]插入!"), decDriver.GetBuffer());
m_editControl.SetWindowText(detectMsg);
}
break;
case DBTF_MEDIA: //光盘
break;
}
}
}
break;
} return TRUE; }
最新文章
- vim简明教程
- 【CentOS】虚拟机网络配置与远程登录
- C#开发系统服务时用的定时器组件
- jQuery 事件的命名空间
- lucene字典实现原理——FST
- Error -27791: Server xx has shut down the connection prematurely
- Android Studio如何设置自己主动提示代码
- 解决IIE8不支持媒体查询的方法
- iOS——系统提供的dispatch方法
- JS显示动态的系统时间--JavaScript基础
- 安卓TextView完美展示html格式代码
- mysql锁机制(Innodb引擎)
- Linux-3.0.8中基于S5PV210的IRQ模块代码追踪和分析
- scala模式匹配详细解析
- 3038 3n+1问题
- DHCP协议总结
- 国网SGCC_UAP 反编译.class文件源代码
- [LeetCode] 876. Middle of the Linked List_Easy tag: Linked List ** slow, fast pointers
- Vue + TypeScript + ElementUI 封装表头查询组件
- feign client 的简单使用(1)