• 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()消息响应函数的方式,底下就先介紹第一種方式,再介绍第二种。

  1. 通过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; }

最新文章

  1. vim简明教程
  2. 【CentOS】虚拟机网络配置与远程登录
  3. C#开发系统服务时用的定时器组件
  4. jQuery 事件的命名空间
  5. lucene字典实现原理——FST
  6. Error -27791: Server xx has shut down the connection prematurely
  7. Android Studio如何设置自己主动提示代码
  8. 解决IIE8不支持媒体查询的方法
  9. iOS——系统提供的dispatch方法
  10. JS显示动态的系统时间--JavaScript基础
  11. 安卓TextView完美展示html格式代码
  12. mysql锁机制(Innodb引擎)
  13. Linux-3.0.8中基于S5PV210的IRQ模块代码追踪和分析
  14. scala模式匹配详细解析
  15. 3038 3n+1问题
  16. DHCP协议总结
  17. 国网SGCC_UAP 反编译.class文件源代码
  18. [LeetCode] 876. Middle of the Linked List_Easy tag: Linked List ** slow, fast pointers
  19. Vue + TypeScript + ElementUI 封装表头查询组件
  20. feign client 的简单使用(1)

热门文章

  1. Flutter实战视频-移动电商-38.路由_Fluro中Handler编写方法
  2. 继承映射关系 joinedsubclass的查询
  3. 如何实现Ant design表单组件封装?
  4. 用spin和edit控件来用spin控制edit里面小数的增减
  5. 51nod 1297
  6. Codeforces714C【映射】
  7. MySQL存储引擎的区别
  8. Unity3D调用摄像头,画面为翻转的问题
  9. C++内存泄漏检测
  10. math(2018.10.27)