QQ登录

只需一步,快速开始

215上位机VC MFC移动硬盘U盘容量序列号名称等信息获取

[ 复制链接 ]

215上位机VC MFC移动硬盘U盘容量序列号名称等信息获取

215上位机VC MFC移动硬盘U盘容量序列号名称等信息获取
215上位机VC MFC移动硬盘U盘容量序列号名称等信息获
功能展示
在开发移动磁盘相关项目时,获取插入磁盘名称,磁盘的总容量剩余可用容量,磁盘序列号,磁盘类型等等一系列的信息后才能够进入一步的操作,我们当前例程实现这些信息有磁盘插入电脑后自动获取,并可选择是否在磁盘插入电脑时自行打开功能,效果如图;
要点提示
系统检测到移动硬盘或U盘的插入与拔出等操作都会向应用程序发送消息WM_DEVICECHANGE,所以我们在自己的应用程序中映射此消息就可检测移动硬盘或U盘的插入与拔出动作,进而获取磁盘的各种信息;在MFC中与此消息关联的函数是afx_msg BOOLOnDeviceChange( UINT nEventType, DWORD dwData );函数的具体介绍已在前一例程介绍;
在此函数中我们定义有一变量PDEV_BROADCAST_VOLUMElpdbv;通过此结构体变量的成员变量lpdbv->dbcv_unitmask)可以获得我们想要的信息,以此我们编写了一两自定义函数FirstDriveFromMask(),GetDriverInfomation()实现插入电脑磁盘的各种信息的获取;
实现功能
1.新建基于对话框的应用程序
2.手工添加函数OnDeviceChange( UINT nEventType,DWORD dwData ),并将此函数与消息WM_DEVICECHANGE进行映射ON_MESSAGE(WM_DEVICECHANGE,OnDeviceChange),我们就可以在函数OnDeviceChange()中进行移动磁盘的插入与拔出检测进而获取磁盘的信息;
3.程序中添加有窗口抖动函数ShakeWindow(),自定义函数FirstDriveFromMask() OnDeviceChange()函数的函数体部分为
  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,sTemp;
  25.         
复制代码
  1. switch (nEventType)
  2.         {
  3.         case DBT_DEVNODES_CHANGED:
  4.                 break;
  5.         case DBT_DEVICEARRIVAL:  //设备已插入,且可用
  6.                 {
  7.                         sTemp.Format("%c:\",FirstDriveFromMask(lpdbv ->dbcv_unitmask));
  8.                 //        ShellExecute(NULL,"Open",sTemp,NULL,NULL,SW_SHOWNORMAL);//要打开U盘,执行此代码
  9.                         ShakeWindow();//抖动窗口
  10.                         sText.Format("%s(%s)",GetDriverInfomation(FirstDriveFromMask(lpdbv ->dbcv_unitmask),GDI_VOLUMENAME),sTemp);//U盘名称
  11.                         SetDlgItemText(IDC_VOLUMENAME,sText);//显示U盘名称与盘符
  12.                         //<>
  13.                         CString sFreeSize  = GetDriverInfomation(FirstDriveFromMask(lpdbv ->dbcv_unitmask),GDI_VOLUMEFREESIZE);//U盘剩余可能容量
  14.                         CString sTotalSize = GetDriverInfomation(FirstDriveFromMask(lpdbv ->dbcv_unitmask),GDI_VOLUMESIZE) ;//U盘总容量
  15.                         float fFreeSize,fTotalSize;
  16.                         fTotalSize = (float)atof(sTotalSize);
  17.                         fFreeSize  = (float)atof(sFreeSize);
  18.                         m_Progress.SetRange32(0,(int)fTotalSize);
  19.                         m_Progress.SetPos((int)(fTotalSize-fFreeSize));
  20.                         //<>
  21.                         sText.Format("%.1fGB free of %.1fGB",fFreeSize/1024,fTotalSize/1024);
  22.                         SetDlgItemText(IDC_VOLUMESIZE,sText);//显示U盘可用与剩余空间
  23.                         //<>U盘序列号等其他自信
  24.                         sText=GetDriverInfomation(FirstDriveFromMask(lpdbv ->dbcv_unitmask),GDI_VOLUMESERIALNUMBER);
  25.                         SetDlgItemText(IDC_EDIT2,sText);
  26.                 sText=GetDriverInfomation(FirstDriveFromMask(lpdbv ->dbcv_unitmask),GDI_VOLUMEFILESYSTEM);
  27.                         SetDlgItemText(IDC_EDIT3,sText);
  28.                 sText=GetDriverInfomation(FirstDriveFromMask(lpdbv ->dbcv_unitmask),GDI_VOLUMETYPE);
  29.                         SetDlgItemText(IDC_EDIT4,sText);        
  30.                 }
  31.                 break;
  32.         case DBT_DEVICEREMOVECOMPLETE:  // 设备已完全安全拔出
  33.                 {
  34.                         ShakeWindow();
  35.                         sTemp.Format("磁盘:(%c:)已拔出",FirstDriveFromMask(lpdbv ->dbcv_unitmask));
  36.                         SetDlgItemText(IDC_EDIT1,sTemp);
  37.                 }
  38.                 break;
  39.         }
  40. }
复制代码
  1. char FirstDriveFromMask( ULONG unitmask )//根据MSDN手册对结构体DEV_BROADCAST_VOLUME的介绍编写此函数
  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. }
复制代码
些许代码过长可以下载例程学习与使用;
我们来演示下功能实现的整个过程
请点击此处下载

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

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

文件名称:215.上位机VC MFC移动硬盘U盘容量序列号名称等信息获取.rar 
文件大小:150.32 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

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

  

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

  

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





回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索