开发者社区> shy丶gril> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

[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方式来获取消息队列,否则会出现无法关闭窗口的问题。

    4.2  2013-2-17  感谢网友提醒,CString getBuffer后应调用ReleaseBuffer

 

 

结束语

  继续恶补基础... 


转载:http://www.cnblogs.com/over140/archive/2010/05/03/1726263.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
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,所以还是用了这个版本。
1181 0
基于USB armory 制作一个USB恶意软件分析器
本文讲的是基于USB armory 制作一个USB恶意软件分析器,前一段时间,一位朋友在自己电脑上插入了一个USB,但不巧的是,USB里含有病毒,结果电脑就中毒了……出于好奇和友情,我决定分析一下其中的恶意软件。于是我用USB armory在我的电脑上建立了一个安全隔离沙箱来分析它。
1540 0
WinCE远程键盘工具
《WinCE桌面助手》基本实现了远程操作WinCE设备的功能,支持鼠标和键盘。而这个远程键盘工具,除了支持键盘外,还支持远程字符粘贴,挺有想法的一个功能,在某些时候,很有作用。       CeKeyboard的界面如下图所示。
529 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载