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()函数的函数体部分为 - void CGkbc8Dlg::ShakeWindow()//随意抖动下窗口;
- {
- CRect rc;
- GetWindowRect(rc);
- SetWindowPos(&wndTop,rc.left-20,rc.top-20,rc.Width(),rc.Height(),SWP_NOSIZE );
- Sleep(50);
- SetWindowPos(&wndTop,rc.left,rc.top-20,rc.Width(),rc.Height(),SWP_NOSIZE );
- Sleep(50);
- SetWindowPos(&wndTop,rc.left,rc.top,rc.Width(),rc.Height(),SWP_NOSIZE );
- Sleep(50);
- SetWindowPos(&wndTop,rc.left+20,rc.top+20,rc.Width(),rc.Height(),SWP_NOSIZE );
- Sleep(50);
- SetWindowPos(&wndTop,rc.left-20,rc.top-20,rc.Width(),rc.Height(),SWP_NOSIZE );
- Sleep(50);
- SetWindowPos(&wndTop,rc.left,rc.top-20,rc.Width(),rc.Height(),SWP_NOSIZE );
- Sleep(50);
- SetWindowPos(&wndTop,rc.left,rc.top,rc.Width(),rc.Height(),SWP_NOSIZE );
- Sleep(50);
- SetWindowPos(&wndTop,rc.left,rc.top,rc.Width(),rc.Height(),SWP_NOSIZE );}
- void CGkbc8Dlg::OnDeviceChange( UINT nEventType, DWORD dwData )
- {
- PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)dwData; // struct transform
- PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
- CString sText,sTemp;
-
复制代码- switch (nEventType)
- {
- case DBT_DEVNODES_CHANGED:
- break;
- case DBT_DEVICEARRIVAL: //设备已插入,且可用
- {
- sTemp.Format("%c:\",FirstDriveFromMask(lpdbv ->dbcv_unitmask));
- // ShellExecute(NULL,"Open",sTemp,NULL,NULL,SW_SHOWNORMAL);//要打开U盘,执行此代码
- ShakeWindow();//抖动窗口
- sText.Format("%s(%s)",GetDriverInfomation(FirstDriveFromMask(lpdbv ->dbcv_unitmask),GDI_VOLUMENAME),sTemp);//U盘名称
- SetDlgItemText(IDC_VOLUMENAME,sText);//显示U盘名称与盘符
- //<>
- CString sFreeSize = GetDriverInfomation(FirstDriveFromMask(lpdbv ->dbcv_unitmask),GDI_VOLUMEFREESIZE);//U盘剩余可能容量
- CString sTotalSize = GetDriverInfomation(FirstDriveFromMask(lpdbv ->dbcv_unitmask),GDI_VOLUMESIZE) ;//U盘总容量
- float fFreeSize,fTotalSize;
- fTotalSize = (float)atof(sTotalSize);
- fFreeSize = (float)atof(sFreeSize);
- m_Progress.SetRange32(0,(int)fTotalSize);
- m_Progress.SetPos((int)(fTotalSize-fFreeSize));
- //<>
- sText.Format("%.1fGB free of %.1fGB",fFreeSize/1024,fTotalSize/1024);
- SetDlgItemText(IDC_VOLUMESIZE,sText);//显示U盘可用与剩余空间
- //<>U盘序列号等其他自信
- sText=GetDriverInfomation(FirstDriveFromMask(lpdbv ->dbcv_unitmask),GDI_VOLUMESERIALNUMBER);
- SetDlgItemText(IDC_EDIT2,sText);
- sText=GetDriverInfomation(FirstDriveFromMask(lpdbv ->dbcv_unitmask),GDI_VOLUMEFILESYSTEM);
- SetDlgItemText(IDC_EDIT3,sText);
- sText=GetDriverInfomation(FirstDriveFromMask(lpdbv ->dbcv_unitmask),GDI_VOLUMETYPE);
- SetDlgItemText(IDC_EDIT4,sText);
- }
- break;
- case DBT_DEVICEREMOVECOMPLETE: // 设备已完全安全拔出
- {
- ShakeWindow();
- sTemp.Format("磁盘:(%c:)已拔出",FirstDriveFromMask(lpdbv ->dbcv_unitmask));
- SetDlgItemText(IDC_EDIT1,sTemp);
- }
- break;
- }
- }
复制代码- char FirstDriveFromMask( ULONG unitmask )//根据MSDN手册对结构体DEV_BROADCAST_VOLUME的介绍编写此函数
- {
- char i;
- for (i = 0; i < 26; ++i)
- {
- if (unitmask & 0x1)
- break;
- unitmask = unitmask >> 1;
- }
- return( i + 'A' );
- }
复制代码些许代码过长可以下载例程学习与使用; 我们来演示下功能实现的整个过程
|