[MFC]U盘检测

简介:

前言

  本文主要是讲在MFC中使用消息队列,并在消息中捕获系统USB插入、卸载U盘的事件。
 

 

正文

  一、MFC中使用消息队列

    1.1  声明

virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
 

    1.2  实现

LRESULT CTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    
return  CDialog::WindowProc(message,wParam,lParam);
}

      本示例是继承CDialog。

 

  二、捕获U盘插入、卸载事件
 

LRESULT CTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    
switch  (message)
    {
        
// WM_DEVICECHANGE,系统硬件改变发出的系统消息
         case  WM_DEVICECHANGE:
        {
            PDEV_BROADCAST_HDR lpdb
= (PDEV_BROADCAST_HDR)lParam;
            
switch (wParam)
            {
                
case  WM_DEVICECHANGE:
                    
break ;
                
case  DBT_DEVICEARRIVAL: // DBT_DEVICEARRIVAL,设备检测结束,并且可以使用
                {
                    
if (lpdb -> dbch_devicetype  ==  DBT_DEVTYP_VOLUME) // 逻辑卷
                    {
                        PDEV_BROADCAST_VOLUME lpdbv 
=   (PDEV_BROADCAST_VOLUME)lpdb;
                        
switch (lpdbv -> dbcv_flags)
                        {
                            
case   0 :                 // U盘
                            {
                                CString decDriver;
                                decDriver 
=  FirstDriveFromMask(lpdbv  -> dbcv_unitmask);
                                TRACE1(
" 检测到U盘:[%s]插入!\n " ,decDriver.GetBuffer( 0 ));
                            }
                                
break ;
                            
case  DBTF_MEDIA:     // 光盘
                                TRACE1( " 检测到光盘:[%c]插入!\n " ,FirstDriveFromMask(lpdbv  -> dbcv_unitmask));
                                
break ;
                        }
                    }
                }
                    
break ;
                
case  DBT_DEVICEREMOVECOMPLETE: // DBT_DEVICEREMOVECOMPLETE,设备卸载或者拔出
                {
                    
if (lpdb -> dbch_devicetype  ==  DBT_DEVTYP_VOLUME) // 逻辑卷
                    {
                        PDEV_BROADCAST_VOLUME lpdbv 
=   (PDEV_BROADCAST_VOLUME)lpdb;
                        
switch (lpdbv -> dbcv_flags)
                        {
                            
case   0 :                 // U盘
                            {
                                CString decDriver;
                                decDriver 
=  FirstDriveFromMask(lpdbv  -> dbcv_unitmask);
                                TRACE1(
" 检测到U盘:[%s]拔出!\n " ,decDriver.GetBuffer( 0 ));
                            }
                                
break ;
                            
case  DBTF_MEDIA:     // 光盘
                                
                                
break ;
                        }
                    }
                }
                    
break ;
            }
        }
        
break ;
    }
    
return  CDialog::WindowProc(message,wParam,lParam);  
}


 

  三、效果图

   

 

  四、文章修改

    4.1  2010-5-7  MFC中使用不要使用SetWindowLong方式来获取消息队列,否则会出现无法关闭窗口的问题。



本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/583033,如需转载请自行联系原作者

相关文章
|
6月前
|
传感器 Windows
(3)将固件加载到已有ArduPilot固件的主板上
(3)将固件加载到已有ArduPilot固件的主板上
54 2
|
传感器 Windows 内存技术
(4)(4.3) 将固件加载到已有ArduPilot固件的主板上
(4)(4.3) 将固件加载到已有ArduPilot固件的主板上
196 0
|
安全 Linux AndFix
win10 资源管理器 可以识别U盘 无法识别 移动硬盘【已解决】
win10 资源管理器 可以识别U盘 无法识别 移动硬盘【已解决】
152 0
win10 资源管理器 可以识别U盘 无法识别 移动硬盘【已解决】
MFC学习——下检测计算机是否联网
MFC学习——下检测计算机是否联网
206 0
|
计算机视觉 Windows
Windows下使用QT+OpenCV完成人脸检测(获取摄像头的数据进行检测)_解决内存释放问题
Windows下使用QT+OpenCV完成人脸检测(获取摄像头的数据进行检测)_解决内存释放问题
379 0
Windows下使用QT+OpenCV完成人脸检测(获取摄像头的数据进行检测)_解决内存释放问题
|
内存技术 芯片
win10 64位JLink v8固件丢失修复总结
大早晨的调着调着程序,视线没离开一会,就发现jlink自动断开连接了,然后重新拔插jlink、重启都不行,才发现小灯已经不亮了,原来是固件损坏了,果断想办法修复这位大爷。 以前修复过这个问题,但当时系统是win7 32位,现在用win10 64位不知道能不能修复,所以查资料,修复过程如下: #0、开始前准备工具1.SAM-BA v2.12.exe 用于烧写固件,下载地址:http://download.csdn.net/detail/hzt12345hf/9457629 新版本的SAM-BA(例如sam-ba v2.9)不能正确连接JLink,所以还是用了这个版本。
2210 0
|
消息中间件
|
测试技术 Windows