MFC U盘检测

& Android DevCamp社区会员特惠限时抢票!                   CSDN账号全站整合公告                 不用买彩票,就有408万!

MFC U盘检测(转)

分类: WinAPI 77人阅读 评论(0)收藏举报

MFC U盘检测(转)  

2010-03-15 15:13:13|  分类: 技术杂文 |字号 订阅

大道不过两三行,说穿一文不值.

本以为程序检测U盘的插入是多么困难的事呢.原来,如此的简单.MFC的一个消息映射就能搞定了.真是想不到.废话少说,切入正题.

首先,看到这么个东东

声明:

afx_msg BOOL   OnDeviceChange(   UINT   nEventType,   DWORD   dwData   );

实现:

BOOL   CXXX::OnDeviceChange(   UINT   nEventType,   DWORD   dwData   )

先看声明,明显是个消息响应函数,我找遍了整个应用程序也没有找到和它对应的消息宏映射,实在是太让人郁闷了.这..这不是挑战我对MFC的理解嘛.

拿出宝剑MSDN.小样,看你怎么跑!

MSDN如是说:

The framework calls this member function to notify an application or device driver of a change to the hardware configuration of a device or the computer框架调用这个函数来通知应用程序或者设备驱动程序设备硬件配置或者电脑的配置被改变了.

我靠,没有想到是框架在调用它!真没有料到,这么一个没有找到宏明宏映射的函数居然是精华所在!再一看还是CWnd的成员函数.真想打自己两耳光!CWnd看了N次,居然没有看到过它.!

但是….但是…打住!虽然是框架在调用,但也有要映射的.这是常识.总不能如此挑战我的常识吧?WM_PAINT也是系统调用,它就有宏映射!

我继续找.我找找找. ON_WM_DEVICECHANGE()看了N久终于看到它了.但是,我为什么在消息里没有看到过这个消息呢?先不管它,把它拿到小程序中测试再说.

对于消息,首先,它是系统调用,不用我操心.

其次,消息不外就那3个东东.声明,映射,实现.

再次,把这3样搬到任何MFC里都能响应!

所以,下面是摘出来的:

BEGIN_MESSAGE_MAP(OGrgFrmRepair, CDialog)

    //{{AFX_MSG_MAP(OGrgFrmRepair)

    //}}AFX_MSG_MAP

    ON_WM_DEVICECHANGE()//这是精华

END_MESSAGE_MAP()

BOOL OGrgFrmRepair::OnDeviceChange(UINT nEventType, DWORD dwData)

{

//这里可以自由发挥的,能检测U盘或者其它硬件的状态,关键也就是那个ON_WM_DEVICECHANGE消息.只要根据nEventType的值不同就可以判断不同的状态.这个消息对应这个处理函数所以在这里可以做自己想做的事.呵呵…具体还是看MSDN吧.上面比我说的清楚多了.

    if( nEventType == DBT_DEVICEREMOVECOMPLETE )

    {

        //Do something

    }

对于下面这个值的说法,MSDN如是说: A device has been inserted and is now available(一个设备插入并且现在可用)这…这说的不就是U盘吗?

    if( nEventType == DBT_DEVICEARRIVAL )

    {

        //Do something

}

}

    afx_msg BOOL OnDeviceChange( UINT nEventType, DWORD dwData );

经测试证明,就是它在检测U盘的状态.具体MSDN上有说明,以OnDeviceChange作关键字就能找到.

但是很奇怪的是,为什么没有这个消息响应来正向完成这个消息机制.?是MSDN改正了还是就是没有公开的?等待答案的揭晓.

网络上的答案:

它是一个被隐藏了的Windows消息,在ClassWizard里面根本看不到它!

MS太不厚道了!

 

[MFC]U盘检测


前言

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

 

正文

  一、MFC中使用消息队列

    1.1  声明

[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); 
}
发布了0 篇原创文章 · 获赞 10 · 访问量 17万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览