工控编程吧
标题:
214上位机VC MFC移动硬盘U盘插入拔出检测与打开
[打印本页]
作者:
qq263946146
时间:
2016-2-28 12:06
标题:
214上位机VC MFC移动硬盘U盘插入拔出检测与打开
(, 下载次数: 3)
上传
点击文件名下载附件
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;
}
}
复制代码
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/9d21aa2844baa9eb6f3ac6d399aa914a/0/0/w_19rszt8xxx.swf-albumId=5379514809-tvId=5379514809-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 1)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4