工控编程吧
标题:
215上位机VC MFC移动硬盘U盘容量序列号名称等信息获取
[打印本页]
作者:
qq263946146
时间:
2016-2-28 12:09
标题:
215上位机VC MFC移动硬盘U盘容量序列号名称等信息获取
(, 下载次数: 1)
上传
点击文件名下载附件
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' );
}
复制代码
些许代码过长可以下载例程学习与使用;
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/6991477d2eae3da35ca75ec8cf2201db/0/0/w_19rsztc2wx.swf-albumId=5379630509-tvId=5379630509-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4