检测是否插入移动优盘

检测是否插入移动优盘

一、查看是否有优盘插入

1  #define  MESSAGEBOX_TITLE    "标题"
2  #define  PLEASE_INSERT_UDISK "请插入U盘以保存打印文件"
3    UsbDiskClass g_usbObject;
4     if  ( g_usbObject.szMoveDiskName[ 1 ==   ' \0 '  )
5                MessageBox(NULL, PLEASE_INSERT_UDISK, MESSAGEBOX_TITLE, MB_OK  |  MB_ICONWARNING);

二、检测优盘函数
 1  /* ***************************************************************************
 2  *
 3  *    FUNCTION: chFirstDriverFrameMask(ULONG unitmask)
 4  *
 5  *    PURPOSE:  get the logic name of driver
 6  *
 7  *************************************************************************** */
 8  char  chFirstDriveFromMask (ULONG unitmask)
 9  {
10 
11          char  i;
12          for  (i  =   0 ; i  <   26 ++ i)  
13         {
14           if  (unitmask  &   0x1
15                  break ;
16          unitmask  =  unitmask  >>   1 ;
17         }
18          return  (i  +   ' A ' );
19   }
20 
21  /* ***************************************************************************
22  *
23  *    FUNCTION: ReInitUSB_Disk_Letter()
24  *
25  *    PURPOSE:  get the usb disks, and filling the 'szMoveDiskName' with them
26  *
27  *************************************************************************** */
28  //  Drive type names
29  #define  DRVUNKNOWN  0
30  #define  DRVFIXED  1
31  #define  DRVREMOTE  2
32  #define  DRVRAM   3
33  #define  DRVCD   4
34  #define  DRVREMOVE  5
35 
36  void  UsbDiskClass::ReInitUSB_Disk_Letter()
37  {
38          int  k  =   0 ;
39         DWORD   MaxDriveSet, CurDriveSet;
40         DWORD   drive, drivetype;
41         TCHAR   szBuf[ 300 ];
42         HANDLE   hDevice;
43         PSTORAGE_DEVICE_DESCRIPTOR pDevDesc;
44 
45          for (k = 0 ; k < 26 ; k ++ )
46          szMoveDiskName[k]  =   ' \0 '
47         k  =   1 ;  
48          //  Get available drives we can monitor
49         MaxDriveSet  =  CurDriveSet  =   0 ;
50          // test code 
51         TCHAR TCFwp[ 50 ],TCF2[ 50 ];
52         MaxDriveSet  =  GetLogicalDrives();
53 
54        // test code output-------------------------------------
55         wsprintf(TCFwp,_T( " %ld " ), MaxDriveSet);
56         MessageBox(NULL, TCFwp, TEXT( " 十进制的 " ), MB_OK);  // 十进制输出
57         _itot(MaxDriveSet, TCF2,  2 );  // _itot(MaxDriveSet, TCF2, 2); _UNICODE Defined
58         MessageBox(NULL, TCF2, TEXT( " 二进制的 " ), MB_OK);  // 二进制输出
59        // test code output-------------------------------------
60 
61        CurDriveSet  =  MaxDriveSet;
62          for  ( drive  =   2 /* 0 */ ; drive  <   32 ++ drive )  
63         {
64                 if  ( MaxDriveSet  &  ( 1   <<  drive) )  
65                {
66                       DWORD temp  =   1 << drive;
67                       TCHAR szDrvName[ 33 ];
68                       _stprintf( szDrvName, _T( " %c:\\ " ),  ' A ' + drive );
69                        switch  ( GetDriveType( szDrvName ) )  
70                       {
71                          case  DRIVE_REMOVABLE:  //  The drive can be removed from the drive.
72                        drivetype  =  DRVREMOVE;
73                        szMoveDiskName[k]  =  chFirstDriveFromMask(temp);
74                        szMoveDiskName[ 0 ] = k;
75                        k ++ ;
76                         break ;
77                      }
78               }
79         }
80 
81  }

 三、直接循环查找

1  CString strdir = _T( "" );
2  for ( char  cc = ' A ' ;cc <= ' Z ' ;cc ++ )
3  {
4      strdir.Format( " %c: " ,cc);
5       if (GetDriveType((LPCTSTR)strdir) == DRIVE_REMOVABLE)   // 判断是不是U盘
6               return  strdir;
7  }
8  return  strdir = _T( "" );         // 没找到就返回空

缺点:循环次数过多
   
有限次数查找:

 1  char  a  =   ' A;    
 2  CString DriveName; 
 3  DWORD dwDrives  =  GetLogicalDrives(); 
 4  while  (dwDrives  >   0
 5 
 6        if  (dwDrives  %   2   ==   1
 7       { 
 8           TCHAR szDrvName[ 33 ];
 9           _stprintf( szDrvName, _T( " %c:\\ " ), a );
10            if (GetDriveType((LPCTSTR)szDrvName) ==  DRIVE_REMOVABLE)   // 判断是不是U盘
11                   return  szDrvName;
12       } 
13       a ++
14       dwDrives  /=   2
15   } 

四、其他方法
转自:http://www.cnblogs.com/over140/archive/2010/05/03/1726263.html

[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);  
}


 

 

你可能感兴趣的:(检测是否插入移动优盘)