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;两函数体为: - 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;
复制代码- switch (nEventType)
- {
- case DBT_DEVNODES_CHANGED: break;
- case DBT_DEVICEARRIVAL: //设备已插入,且可用
- {
- sText.Format("%c:\",FirstDriveFromMask(lpdbv ->dbcv_unitmask) ); //搞成盘符格式
- ShellExecute(NULL,"Open",sText,NULL,NULL,SW_SHOWNORMAL);//打开U盘
- unsigned int type= GetDriveType(sText);//获取盘符类型
- if(type == DRIVE_UNKNOWN)
- sText = "已插入\r\n未知类型";
- else if(type == DRIVE_NO_ROOT_DIR)
- sText = "已插入\r\n无效的根路径";
- else if(type == DRIVE_REMOVABLE)
- sText = "已插入\r\n可移动磁盘或软盘";
- else if(type == DRIVE_FIXED)
- sText = "已插入\r\n本地硬盘";
- else if(type == DRIVE_REMOTE)
- sText = "已插入\r\n网络磁盘";
- else if(type == DRIVE_CDROM)
- sText = "已插入\r\nCD-ROM";
- else if(type == DRIVE_RAMDISK)
- sText = "已插入\r\nRAM";
- else
- sText = "已插入\r\n未知类型";
- SetDlgItemText(IDC_TEXT,sText);
- ShakeWindow();
- } break;
- case DBT_DEVICEREMOVECOMPLETE: // 设备已完全安全拔出
- {
- sText.Format("已拔出磁盘\r\n%c:\",FirstDriveFromMask(lpdbv ->dbcv_unitmask) ); //搞成盘符格式
- SetDlgItemText(IDC_TEXT,sText);
- ShakeWindow();
- } break;
- }
- }
复制代码我们来演示下功能实现的整个过程
|