我用mfc开发,用OnDeviceChange(UINT nEventType,DWORD_PTR dwData)消息回调函数来处理消息,但是一个奇怪的问题就是某些非标准usb设备(比如一些电子钥匙),插入或拔出的时候始终只发送DBT_DEVNODES_CHANGED消息(即nEventType== 7),而且dwData始终为0;但是如果插入一些普通U盘,就可以截获到DBT_DEVICEARRIVAL、DBT_DEVICEREMOVECOMPLETE等消息。这是怎么回事那?
    另外,我想滤除其它usb设备插入与拔出时产生的DBT_DEVNODES_CHANGED消息,我该怎么办?一定要写过滤驱动程序吗?还有其它办法没有?
    多谢多谢!并祝愿大家十一和中秋双节快乐!

解决方案 »

  1.   

    以前我是通過搜索盤符的api,但是不能區分軟盤
      

  2.   

    告诉你吧,这个得自己注册事件
    BOOL CRSDlg::DoRegisterDeviceInterface(GUID InterfaceClassGuid, HDEVNOTIFY *hDevNotify)
    {
    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
        DWORD Err;    ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
        NotificationFilter.dbcc_size = 32;
           // sizeof(DEV_BROADCAST_DEVICEINTERFACE);
        NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
        NotificationFilter.dbcc_classguid = InterfaceClassGuid;    *hDevNotify = RegisterDeviceNotification(GetSafeHwnd(), &NotificationFilter,
           DEVICE_NOTIFY_WINDOW_HANDLE    );
        if(!*hDevNotify) 
        {
            Err = GetLastError();
    CString str;
    str.Format(_T("RegisterDeviceNotification failed: %lx."),Err);
            DT((LPCSTR)str);
            return FALSE;
        }
      DT("RegisterDeviceNotification Successed :)");
    //UnregisterDeviceNotification(*hDevNotify);
        return TRUE;
    }至于InterfaceClassGuid这个参数,你得在你的驱动文件中查看它的guid啦
    上面的方法保证绝对可以,你慢慢调试吧下次记得给点数,不然不回答啦