我拦截WM_DEVICECHANGE得到了设备停用启用的通知,但是无法得知具体是哪个设备状态改变了。想了个笨方法,先得到设备状态,发现变化再进行比较。请问如何判断设备(比如USB端口)是否被启用?

解决方案 »

  1.   

      查查windows消息相关资料, 可能对你有帮助!
      

  2.   

    BOOL      
    IsDisabled( DWORD DevID, HDEVINFO hDevInfo )   // 该设备是否已被禁用
    {
    SP_DEVINFO_DATA hDevInfoData = {sizeof(SP_DEVINFO_DATA)};
    if ( !::SetupDiEnumDeviceInfo( hDevInfo, DevID, &hDevInfoData ) )
    {
    return FALSE;
    }
    DWORD Status, Problem;
    if( ::CM_Get_DevNode_Status( &Status, &Problem, hDevInfoData.DevInst, 0 ) != CR_SUCCESS )
    return FALSE;
    return ( (Status&DN_HAS_PROBLEM) && (Problem==CM_PROB_DISABLED) );
    }
    BOOL      
    IsDisableable( DWORD DevID, HDEVINFO hDevInfo ) // 该设备是否可以被禁用
    {
    SP_DEVINFO_DATA hDevInfoData = {sizeof(SP_DEVINFO_DATA)};
    if ( !::SetupDiEnumDeviceInfo( hDevInfo, DevID, &hDevInfoData ) )
    {
    return FALSE;
    }
    DWORD Status, Problem;
    if( ::CM_Get_DevNode_Status( &Status, &Problem, hDevInfoData.DevInst, 0 ) != CR_SUCCESS )
    return FALSE;
    return ( (Status&DN_DISABLEABLE) && (Problem==CM_PROB_HARDWARE_DISABLED) );
    }
      

  3.   

    6楼的应该是正确的,return ( (Status&DN_HAS_PROBLEM) && (Problem==CM_PROB_DISABLED) ); 
    这句代表目标设备的状态:设备已经被禁用