星空网 > 软件开发 > 操作系统

MFC U盘检测

  •  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来说明

          程序界面如下:

                                                      MFC U盘检测images/loading.gif' data-original="http://images2015.cnblogs.com/blog/706320/201602/706320-20160215144057798-1261356958.jpg" />

          需要包含的头文件:

#include <dbt.h>#include <winioctl.h> 

    重写WindowProc()函数实现U盘检测,代码如下:

MFC U盘检测MFC U盘检测
 1 char FirstDriveFromMask(ULONG unitmask) //獲取盤符 2 { 3   char i; 4   for (i = 0; i < 26; ++i) 5   { 6     if (unitmask & 0x1) 7       break; 8     unitmask = unitmask >> 1; 9   }10   return (i + 'A');11 }12 13 14 LRESULT CUpanDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)15 {16   CString detectMsg;17   18   switch (message)19   {20     //WM_DEVICECHANGE,系统硬件改变发出的系统消息21   case WM_DEVICECHANGE:22     {23       PDEV_BROADCAST_HDR lpdb=(PDEV_BROADCAST_HDR)lParam;24       switch(wParam)25       {26       case WM_DEVICECHANGE:27         break;28       case DBT_DEVICEARRIVAL://设备检测结束,并且可以使用29         {30           if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷31           {32             PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;33             switch(lpdbv->dbcv_flags)34             {35             case 0:        //U盘36               {37                 CString decDriver;38                 decDriver = FirstDriveFromMask(lpdbv ->dbcv_unitmask);39                 detectMsg.Format(_T("检测到U盘:[%s]插入!"), decDriver.GetBuffer(0)); 40                 m_editControl.SetWindowText(detectMsg);41               }42               break;43             case DBTF_MEDIA:  //光盘44               break;45             }46           }47         }48         break;49       case DBT_DEVICEREMOVECOMPLETE://设备卸载或者拔出50         {51           if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷52           {53             PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;54             switch(lpdbv->dbcv_flags)55             {56             case 0:        //U盘57               {58                 CString decDriver;59                 decDriver = FirstDriveFromMask(lpdbv ->dbcv_unitmask);60                 detectMsg.Format(_T("检测到U盘:[%s]拔出!"), decDriver.GetBuffer(0)); 61                 m_editControl.SetWindowText(detectMsg);62               }63               break;64             case DBTF_MEDIA:  //光盘65 66               break;67             }68           }69         }70         break;71       }72     }73     break;74   }75 76   return CDialog::WindowProc(message, wParam, lParam);77 }

View Code

         程序运行结果如下:

      插入U盘时:

                    MFC U盘检测

      拔出U盘时:

                    MFC U盘检测

 

  

  2.  通过OnDeviceChange()的方式检测U盘

首先在头文件声明一个消息函数:

afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);

消息映射:

BEGIN_MESSAGE_MAP(OGrgFrmRepair, CDialog)  ON_WM_DEVICECHANGE()END_MESSAGE_MAP()

实现:

MFC U盘检测MFC U盘检测
 1 char FirstDriveFromMask(ULONG unitmask) //獲取盤符 2 { 3   char i; 4   for (i = 0; i < 26; ++i) 5   { 6     if (unitmask & 0x1) 7       break; 8     unitmask = unitmask >> 1; 9   }10   return (i + 'A');11 }12 13 14 BOOL CUpanDlg::OnDeviceChange(UINT nEventType, DWORD dwData)15 {16   CString detectMsg;17   PDEV_BROADCAST_HDR lpdb=(PDEV_BROADCAST_HDR)dwData;18 19   switch (nEventType)20   {21   case DBT_DEVICEREMOVECOMPLETE:22     {23       if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷24       {25         PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;26         switch(lpdbv->dbcv_flags)27         {28         case 0:        //U盘29           {30             CString decDriver;31             decDriver = FirstDriveFromMask(lpdbv ->dbcv_unitmask);32             detectMsg.Format(_T("检测到U盘:[%s]拔出!"), decDriver.GetBuffer(0)); 33             m_editControl.SetWindowText(detectMsg);34           }35           break;36         case DBTF_MEDIA:  //光盘37 38           break;39         }40       }41     }42     break;43   case DBT_DEVICEARRIVAL:44     {45       if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷46       {47         PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;48         switch(lpdbv->dbcv_flags)49         {50         case 0:        //U盘51           {52             CString decDriver;53             decDriver = FirstDriveFromMask(lpdbv ->dbcv_unitmask);54             detectMsg.Format(_T("检测到U盘:[%s]插入!"), decDriver.GetBuffer(0)); 55             m_editControl.SetWindowText(detectMsg);56           }57           break;58         case DBTF_MEDIA:  //光盘59           break;60         }61       }62     }63     break;64   }65 66   return TRUE;67 68 }

View Code

 




原标题:MFC U盘检测

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

独立站靠什么引流:https://www.goluckyvip.com/tag/30735.html
独立站跨境电商:https://www.goluckyvip.com/tag/30736.html
独立站跨境电商是什么意思:https://www.goluckyvip.com/tag/30737.html
独立站跨境电商怎么做:https://www.goluckyvip.com/tag/30738.html
今天起:https://www.goluckyvip.com/tag/3074.html
独立站铺货:https://www.goluckyvip.com/tag/30741.html
独家丨B站广告位可跳转美团APP B站为电商平台引流再升级 :https://www.kjdsnews.com/a/1836410.html
百崖大峡谷生态旅游景区(探秘中国西南自然风光):https://www.vstour.cn/a/363176.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流