大灰狼

在VC中如何控制usb盘


在VC中如何控制usb盘,从程序中控制,如停止,弹出等等操作,现在主要是不知道如何停止,而U盘又不能直接弹出(非要先停止)  
   
  能告诉具体的方法或者相应的可用的API也可,谢谢!
问题点数:100、回复次数:10
Top
 

1 楼saliors(正在学习中)回复于 2005-08-17 08:33:22 得分 0 监测u盘插入,则根据WM_DEVICECHANGE消息。  
  LRESULT   CTestUSBDlg::WindowProc(UINT   message,   WPARAM   wParam,   LPARAM   lParam)    
  {  
  if(message   ==   WM_DEVICECHANGE)   //0x8000,0x8004  
  {  
  CString   str;  
  DEV_BROADCAST_HDR*   dhr   =   (DEV_BROADCAST_HDR   *)lParam;  
  switch(wParam)  
  {  
  case   DBT_CONFIGCHANGECANCELED:  
  TRACE("DBT_CONFIGCHANGECANCELED");  
  break;  
  case   DBT_CONFIGCHANGED:  
  TRACE("DBT_CONFIGCHANGED");  
  break;  
  case   DBT_DEVICEQUERYREMOVE:  
  TRACE("DBT_DEVICEQUERYREMOVE");  
  break;  
  case   DBT_DEVICEQUERYREMOVEFAILED:  
  TRACE("DBT_DEVICEQUERYREMOVEFAILED");  
  break;  
  case   DBT_DEVICEREMOVEPENDING:  
  TRACE("DBT_DEVICEREMOVEPENDING");  
  break;  
  case   DBT_DEVICETYPESPECIFIC:  
  TRACE("DBT_DEVICETYPESPECIFIC");  
  break;  
  case   DBT_QUERYCHANGECONFIG:  
  TRACE("DBT_QUERYCHANGECONFIG");  
  break;  
  case   DBT_USERDEFINED:  
  TRACE("DBT_USERDEFINED");  
  break;  
  case   DBT_DEVICEARRIVAL:  
  if(dhr->dbch_devicetype   ==   DBT_DEVTYP_VOLUME)  
  {  
  PDEV_BROADCAST_VOLUME   lpdbv   =   (PDEV_BROADCAST_VOLUME)dhr;  
  if(lpdbv->dbcv_flags   &   DBTF_MEDIA)  
  {  
  str.Format("Drive   %c   插入",   FirstDriveFromMask(lpdbv   ->dbcv_unitmask));  
  //AfxMessageBox(str);  
  }  
  else  
  {  
  char   ch   =   FirstDriveFromMask(lpdbv   ->dbcv_unitmask);  
  str.Format("%c:\\",ch);  
  }  
  }  
  break;  
  case   DBT_DEVICEREMOVECOMPLETE:  
  if(dhr->dbch_devicetype   ==   DBT_DEVTYP_VOLUME)  
  {  
  PDEV_BROADCAST_VOLUME   lpdbv   =   (PDEV_BROADCAST_VOLUME)dhr;  
  if(lpdbv->dbcv_flags   &   DBTF_MEDIA)  
  {  
  str.Format("Drive   %c   拔除",FirstDriveFromMask(lpdbv   ->dbcv_unitmask));  
  }  
  else  
  {  
  str.Format("Drive   %c   拔除",FirstDriveFromMask(lpdbv   ->dbcv_unitmask));  
  }  
  //AfxMessageBox(str);  
  }  
  break;  
  default:  
  break;  
  }  
  }  
  return   CDialog::WindowProc(message,   wParam,   lParam);  
  }  
 
Top

2 楼saliors(正在学习中)回复于 2005-08-17 09:54:34 得分 100弹出U盘:  
  #include   <tchar.h>  
  #include   <stdio.h>  
  #include   <windows.h>  
  #include   <devguid.h>  
   
  #define   DWORD_PTR   DWORD  
  #define   ULONG_PTR   DWORD  
   
   
  extern   "C"   {    
  #include   "hidsdi.h"    
  }  
  //   需加入hid.lib  
   
  #include   <setupapi.h>  
  //   需加入setupapi.lib  
   
  #include   <regstr.h>  
  #include   <winbase.h>  
   
  #include   <cfgmgr32.h>  
  //   需要加入cfgmgr32.lib  
   
  #include   <initguid.h>  
  //#include   <usbiodef.h>  
  DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE,  
      0xA5DCBF10L,   0x6530,   0x11D2,   0x90,   0x1F,   0x00,   0xC0,   0x4F,   0xB9,   0x51,   0xED);  
  #define   GUID_CLASS_USB_DEVICE                       GUID_DEVINTERFACE_USB_DEVICE  
   
  int   main(int   argc,   _TCHAR*   argv[])  
  {  
        HDEVINFO   hDevInfo;  
         
        SP_DEVINFO_DATA   DeviceInfoData;  
        DWORD   i;  
   
        //--------------------------------------------------------------------------  
        //   获取设备信息  
        hDevInfo   =   SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE,  
                0,   //   Enumerator  
                0,  
                DIGCF_PRESENT   |   DIGCF_DEVICEINTERFACE   );  
        if   (hDevInfo   ==   INVALID_HANDLE_VALUE)    
        {  
                //   查询信息失败  
                printf("ERROR   -   SetupDiGetClassDevs()");  
                return   1;  
        }  
        //--------------------------------------------------------------------------  
   
        //   枚举每个USB设备  
        DeviceInfoData.cbSize   =   sizeof(SP_DEVINFO_DATA);  
        for   (i=0;SetupDiEnumDeviceInfo(hDevInfo,   i,   &DeviceInfoData);i++)  
        {  
                  LPTSTR   buffer   =   NULL;  
                  PVOID   buffer2   =   NULL;  
                  DWORD   buffersize   =   0;  
                  ULONG   len;  
                  CONFIGRET       cr;  
                  PNP_VETO_TYPE   pnpvietotype;  
                  CHAR   vetoname[MAX_PATH];  
                  ULONG   ulStatus;  
                  ULONG   ulProblemNumber;  
   
                  cr   =   CM_Get_DevNode_Status(   &ulStatus,  
                                                                          &ulProblemNumber,  
                                                                          DeviceInfoData.DevInst,  
                                                                          0);  
                  if   (   CR_SUCCESS   ==   cr   )    
  {  
                          printf("OK   -   CM_Get_DevNode_Status()[%d]\n",   cr);  
                          printf("OK   -   CM_Get_DevNode_Status()   sts   [%x]\n",   ulStatus);  
                          printf("OK   -   CM_Get_DevNode_Status()   pro   [%x]\n",   ulProblemNumber);  
                  }    
  else    
  {  
                          printf("ERROR   -   CM_Get_DevNode_Status()[%d]\n",   cr);  
                          printf("ERROR   -   CM_Get_DevNode_Status()[%d]\n",   GetLastError());  
                  }  
                  //   DN_DISABLEABLE   or   DN_REMOVABLE  
                  if   ((DN_DISABLEABLE   &   ulStatus   )   !=   0   )    
  {  
                          printf("HAS   -   DN_DISABLEABLE()[%x]\n",   DN_DISABLEABLE   &   ulStatus);  
                  }    
  else    
  {  
                        continue;  
                  }  
                  if   ((DN_REMOVABLE   &   ulStatus   )   !=   0   )    
  {  
                          printf("HAS   -   DN_REMOVABLE()[%x]\n",   DN_REMOVABLE   &   ulStatus);  
                  }  
  else    
  {  
                        continue;  
                  }  
   
                  len   =   MAX_PATH;  
                  //   pnpvietotype   =   PNP_VetoDevice;    
                  cr   =   CM_Request_Device_Eject(  
                                                          DeviceInfoData.DevInst,  
                                                          &pnpvietotype,  
                                                          vetoname,  
                                                          len,  
                                                          0  
                                                          );  
                  if   (   CR_SUCCESS   ==   cr   )   {  
                          printf("OK   -   CM_Request_Device_Eject()[%d]\n",   cr);  
                  }   else   {  
                          printf("ERROR   -   CM_Request_Device_Eject()[%d]\n",   cr);  
                          printf("ERROR   -   CM_Request_Device_Eject()[%d]\n",   GetLastError());  
                  }  
   
        }  
                 
                 
        if   (   GetLastError()!=NO_ERROR   &&  
                  GetLastError()!=ERROR_NO_MORE_ITEMS   )  
        {  
                //   Insert   error   handling   here.  
                return   1;  
        }  
                 
        //     Cleanup  
        SetupDiDestroyDeviceInfoList(hDevInfo);  
   
        return   0;  
  }
Top

3 楼agchen81(吾将上下尔求索)回复于 2005-08-17 10:19:03 得分 0 强,当时我做这种功能时花了很多心血啊
Top

4 楼cangjing(方长)回复于 2005-08-17 10:30:47 得分 0 hidsdi.h    
  hid.lib  
   
  setupapi.h  
  setupapi.lib  
   
   
  ......  
   
  等等到哪儿去找?
Top

5 楼masterz(www.fruitfruit.com)回复于 2005-08-17 12:05:08 得分 0 install   microsoft   platform   sdk  
  www.microsoft.com/msdownload/platformsdk/sdkupdate/  
   
 
Top

6 楼masterz(www.fruitfruit.com)回复于 2005-08-17 12:05:49 得分 0 you   can   also   have   a   look   at   DeviceIoControl
Top

7 楼saliors(正在学习中)回复于 2005-08-17 13:40:32 得分 0 装WIN2000SDK
Top

8 楼DrSmart(斯玛特)回复于 2005-09-30 12:49:08 得分 0 这是硬件相关的在DDK中,sdk他有吗?

 


新问题出炉---如何解决USEkey插入时让程序即时运行楼主sunxutx(孤云挂月)2006-06-27 22:11:19 在 VC/MFC / 进程/线程/DLL 提问
一种类似于硬件狗似的key类产品  
  如何在它插入usb接口时候让系统运行我安装好的程序  
  或者程序已经运行,当key插入时通知已运行的程序  
  是否有一些系统参数能够利用  
  请各位前辈指点一二  
  最好能附上一些例子  
  谢谢   分不够可以再加
问题点数:100、回复次数:9
Top
 

1 楼goingup(向我开火!)回复于 2006-06-27 23:09:12 得分 0 USBKey吧?  
  不是很懂,帮你顶
Top

2 楼aa3000(杀手K)回复于 2006-06-27 23:14:24 得分 0 楼主说的KEY允许增加自己的程序进去吗?如果可以的话加一个自动运行,里面调用一个自己写的程序,这个程序怎么写就随便咯
Top

3 楼gohappy_1999(碧水蓝天)回复于 2006-06-28 11:48:52 得分 50有个WM_DEVICECHANGE系统消息监视设备插入拔除
Top

4 楼sunxutx(孤云挂月)回复于 2006-06-28 14:05:14 得分 0 这个key里面只有64k,并且插入的时候,任何设备管理都看不到  
  与u盘不一样  
  所以挺郁闷的
Top

5 楼gohappy_1999(碧水蓝天)回复于 2006-06-28 16:58:25 得分 0 插入的时候,任何设备管理都看不到  
  ....................................  
  没装驱动?重起也看不到?
Top

6 楼sunxutx(孤云挂月)回复于 2006-06-28 19:30:00 得分 0 是这样的  
  是我没叙述清楚  
  插入usbkey后   在   设备管理器的通用串行总线控制器  
  中有显示  
  但是不知道该怎样编辑  
  自带的管理工具中他可以识别key插入和拔出  
  不知是怎么设计的  
  而并不像u盘中的数据在我的电脑中就能看到  
 
Top

7 楼gohappy_1999(碧水蓝天)回复于 2006-06-28 20:36:04 得分 50那你可以另外写个程序,捕获WM—DEVICECHANGE消息,判断是不是你的USBKEY的插拔。  
  (这里可以参考一下:http://community.csdn.net/Expert/TopicView3.asp?id=4211978)  
  在你的这个程序中启动另一个程序既可。  
 
Top

8 楼sunxutx(孤云挂月)回复于 2006-06-29 04:51:33 得分 0 郁闷   由于开发周期的原因   我是用vb写的代码  
  hook已经可以拦截到键盘却拦截不了系统消息。。。  
  更别提WM—DEVICECHANGE  
  没有   语法错误。。。  
  不晓得怎么弄了  
 
Top

9 楼sunxutx(孤云挂月)回复于 2006-06-30 16:48:52 得分 0 拦截到了系统消息   呼~  
  谢谢大家热心帮忙  
  发分
Top

posted on 2007-10-23 20:58  段兴传  阅读(4084)  评论(0编辑  收藏  举报

导航