插入移动硬盘后,如何自动启动一程序对USB盘内容进行检测。

解决方案 »

  1.   

    嗯,再贴一次,赚点分:
    监测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);
    }
      

  2.   

    哥们,非常感谢,帮人帮到底,FirstDriveFromMask?函数请一并给出
      

  3.   

    saliors大哥,看到你的贴子深受启发,人民感谢你。请问为何我照着你的方法去做时,却不进入if(message == WM_DEVICECHANGE),是什么原因呀?急,偶是新手,渴望再次得到你的启发,谢谢,领导在催中……
      

  4.   

    WM_DEVICECHANGE这个表示发现USB等设备,你的SDK是否更新等
      

  5.   

    谢谢各位,我用ON_MESSAGE(WM_DEVICECHANGE, OnDeviveChange)的方式就可以检测到设备信息了
      

  6.   

    各位大虾 通过WM_DEVICECHANGE 可以检测到usb接口设备 那属于disk类的usb设备该
    如何检测呢  disk 类的设备一般采用的是mtp协议 我分别用了两种方法来检测设备
     1 . WM_DEVICECHANGE 如 (saliors(正在学习中) 兄:)的方法 检测出了基本信息
       但是disk 类设备检测不到
     2.我采用的是通过硬件设备的guid来枚举检测硬件设备 通过设备路径来获取各种信息
       这种方法也是检测不到。
     请各位大虾看看是什么问题。谢谢!!!!
      

  7.   

    如何知道USB是连接还是断开??????????
      

  8.   

    LRESULT CMP3DownloadDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    // TODO: Add your specialized code here and/or call the base class
    DWORD ThreadId;
    bool allzero=true;
    int i; if(message==WM_DEVICECHANGE)
    {
    if(wParam==DBT_DEVICEARRIVAL)//有新设备插入系统
    {
    DEV_BROADCAST_HDR* pDev=(DEV_BROADCAST_HDR*)lParam;
    if(pDev->dbch_devicetype==DBT_DEVTYP_VOLUME )//移动存储设备
    {
    DEV_BROADCAST_VOLUME* pDisk=(DEV_BROADCAST_VOLUME*)lParam;
    DWORD mask=pDisk->dbcv_unitmask;

    char dir[MAX_PATH];
    for(i=0;i<32;i++)
    {
    if((mask>>i)==1)
    {
    dir[0]='A'+i;
    dir[1]='\0';
    strcat(dir,":\\");
    break;
    }
    } if(i==32)
    {
    AfxMessageBox("无效的分区名!");
    return CDialog::WindowProc(message, wParam, lParam);
    }
    else
    {
    //dir就是U盘对应的分区
    }
    }
    }
    } return CDialog::WindowProc(message, wParam, lParam);
    }