QQ登录

只需一步,快速开始

214上位机VC MFC移动硬盘U盘插入拔出检测与打开

[ 复制链接 ]

214上位机VC MFC移动硬盘U盘插入拔出检测与打开

214上位机VC MFC移动硬盘U盘插入拔出检测与打开
214上位机VC MFC移动硬盘U盘插入拔出检测与打开
功能展示
移动硬盘和U盘在生活中使用的频率非常大,很多软件都能够检测移动硬盘和U盘的插入与拔出再进一步对这些磁盘进行打开读写文件的操作,我们当前例程也实现移动硬盘和U盘的插入拔出检测,获取系统给其分配的盘符再为用户打开磁盘的功能,检测到有插入或拔出例程窗口还会抖动提示用户,效果如图;
要点提示
系统检测到移动硬盘或U盘的插入与拔出等操作都会向应用程序发送消息WM_DEVICECHANGE,所以我们在自己的应用程序中映射此消息就可检测移动硬盘或U盘的插入与拔出动作;在MFC中与此消息关联的函数是afx_msg BOOLOnDeviceChange( UINT nEventType, DWORD dwData );
函数参数:nEventType事件类型。其取值参见下面说明部分。dwData包含了与事件有关的数据的结构的地址。它的含义依赖于给定的事件。框架调用这个函数以通知应用程序或设备驱动程序,设备或计算机的硬件配置发生了改变。
对于提供了软件控制功能,如弹出和锁定的设备,操作系统通常发送一条DBT_DEVICEREMOVEPENDING消息,以便使应用程序和设备驱动程序停止对设备的使用。
如果操作系统强行清除了一个设备,它可能不会发送DBT_DEVICEQUERYREMOVE消息。
nEvent参数可以是下列值之一:·DBT_DEVICEARRIVAL已经加入了一个设备,现在可以使用。·DBT_DEVICEQUERYREMOVE允许清除被请求的设备。任何应用程序都可以拒绝这个请求并取消清除操作。·DBT_DEVICEQUERYREMOVEFAILED清除设备的请求被取消了。·DBT_DEVICEREMOVEPENDING设备将要被清除。不能拒绝。·DBT_DEVICEREMOVECOMPLETE设备已经被清除。·DBT_DEVICETYPESPECIFIC与设备有关的事件。·DBT_CONFIGCHANGED当前配置发生了变化。·DBT_DEVNODES_CHANGED设备节点发生了变化。
实现功能
1.新建基于对话框的应用程序
2.手工添加函数OnDeviceChange( UINT nEventType,DWORD dwData ),并将此函数与消息WM_DEVICECHANGE进行映射ON_MESSAGE(WM_DEVICECHANGE,OnDeviceChange),我们就可以在函数OnDeviceChange()中进行移动磁盘的插入与拔出检测;
3.程序中还添加有窗口抖动函数ShakeWindow(),检测 结果显示的静态文件控件IDC_TEXT;两函数体为:
  1. void CGkbc8Dlg::ShakeWindow()//随意抖动下窗口;
  2. {
  3.         CRect rc;
  4.         GetWindowRect(rc);
  5.         SetWindowPos(&wndTop,rc.left-20,rc.top-20,rc.Width(),rc.Height(),SWP_NOSIZE );
  6.         Sleep(50);
  7.         SetWindowPos(&wndTop,rc.left,rc.top-20,rc.Width(),rc.Height(),SWP_NOSIZE );
  8.         Sleep(50);
  9.         SetWindowPos(&wndTop,rc.left,rc.top,rc.Width(),rc.Height(),SWP_NOSIZE );
  10.         Sleep(50);
  11.         SetWindowPos(&wndTop,rc.left+20,rc.top+20,rc.Width(),rc.Height(),SWP_NOSIZE );
  12.         Sleep(50);
  13.         SetWindowPos(&wndTop,rc.left-20,rc.top-20,rc.Width(),rc.Height(),SWP_NOSIZE );
  14.         Sleep(50);
  15.         SetWindowPos(&wndTop,rc.left,rc.top-20,rc.Width(),rc.Height(),SWP_NOSIZE );
  16.         Sleep(50);
  17.         SetWindowPos(&wndTop,rc.left,rc.top,rc.Width(),rc.Height(),SWP_NOSIZE );
  18.         Sleep(50);
  19.         SetWindowPos(&wndTop,rc.left,rc.top,rc.Width(),rc.Height(),SWP_NOSIZE );}
  20. void CGkbc8Dlg::OnDeviceChange( UINT nEventType, DWORD dwData )
  21. {
  22.         PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)dwData;     // struct transform
  23.         PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
  24.         CString sText;
复制代码
  1. switch (nEventType)
  2.         {
  3. case DBT_DEVNODES_CHANGED: break;
  4.         case DBT_DEVICEARRIVAL:  //设备已插入,且可用
  5.                 {
  6.                         sText.Format("%c:\",FirstDriveFromMask(lpdbv ->dbcv_unitmask) ); //搞成盘符格式
  7.                         ShellExecute(NULL,"Open",sText,NULL,NULL,SW_SHOWNORMAL);//打开U盘
  8.                         unsigned int type= GetDriveType(sText);//获取盘符类型
  9.                         if(type == DRIVE_UNKNOWN)
  10.                                 sText = "已插入\r\n未知类型";
  11.                         else if(type == DRIVE_NO_ROOT_DIR)
  12.                                 sText = "已插入\r\n无效的根路径";
  13.                         else if(type == DRIVE_REMOVABLE)
  14.                                 sText = "已插入\r\n可移动磁盘或软盘";
  15.                         else if(type == DRIVE_FIXED)
  16.                                 sText = "已插入\r\n本地硬盘";
  17.                         else if(type == DRIVE_REMOTE)
  18.                                 sText = "已插入\r\n网络磁盘";        
  19.                         else if(type ==  DRIVE_CDROM)
  20.                                 sText = "已插入\r\nCD-ROM";
  21.                         else if(type ==  DRIVE_RAMDISK)
  22.                                 sText = "已插入\r\nRAM";
  23.                         else
  24.                                 sText = "已插入\r\n未知类型";
  25.                         SetDlgItemText(IDC_TEXT,sText);
  26.                         ShakeWindow();
  27.                 } break;
  28.         case DBT_DEVICEREMOVECOMPLETE:  // 设备已完全安全拔出
  29.                 {
  30.                         sText.Format("已拔出磁盘\r\n%c:\",FirstDriveFromMask(lpdbv ->dbcv_unitmask) ); //搞成盘符格式
  31.                         SetDlgItemText(IDC_TEXT,sText);
  32.                         ShakeWindow();
  33.                 } break;
  34.         }
  35. }
复制代码
我们来演示下功能实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:214.上位机VC MFC移动硬盘U盘插入拔出检测与打开.rar 
文件大小:132.23 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索