c++ - 如何在 C++ 中获取 Windows 中的设备属性?

标签 c++ winapi properties device

在 Windows 中,如果我打开设备管理器 -> 右键单击​​设备 -> 属性 -> 详细信息,我会得到 {Property, Value} 对。我想在 Visual Studio 的 C++ 代码中访问它们。我如何获得它?

谢谢,

最佳答案

试试 SetupDi_ 函数,看看 here例如。

HDEVINFO WinDeviceHelper::getDevInfoForClass(QString devClassName,DWORD& dwCount)
{

    //DWORD dwGuids = 0;

    SetupDiClassGuidsFromNameW( qPrintableW(devClassName), 0, 0, &dwCount );

    //emit sSearchStarted(dwGuids);

    if(dwCount)
    {
        GUID* pGuids = new GUID[dwCount];

        BOOL success = SetupDiClassGuidsFromNameW( qPrintableW(devClassName), pGuids, dwCount, &dwCount );

        HDEVINFO hDevInfoSet = SetupDiGetClassDevsW( pGuids, NULL, NULL, DIGCF_PRESENT);

        delete [] pGuids;

        return hDevInfoSet;
    }
    else
    {
        return NULL;
    }
}
bool WinDeviceHelper::getDeviceRegistryString(HDEVINFO hDevInfoSet,SP_DEVINFO_DATA &devInfo,DWORD propertyType,QString& propValue)
{
    DWORD dwType = 0;
    DWORD requiredSize=0;
    propValue="";
    BOOL result=SetupDiGetDeviceRegistryPropertyW( hDevInfoSet, &devInfo, propertyType, &dwType, NULL, NULL, &requiredSize);
    if ((result==ERROR_INVALID_DATA) || ((dwType!=REG_MULTI_SZ)&&(dwType!=REG_SZ)) || (requiredSize==0) )
    {
        return false;
        //throw std::exception(__FILE__":"__LINE__" "__FUNCDNAME__":  Error reading registry info");
    }
    size_t strSize=requiredSize/sizeof(wchar_t)+1;
    wchar_t* requestedData = new wchar_t[strSize];// буфер
    result=SetupDiGetDeviceRegistryPropertyW( hDevInfoSet, &devInfo, propertyType, &dwType,reinterpret_cast<PBYTE>(requestedData), requiredSize, &requiredSize);
    if(result==TRUE )
    {
        propValue=QString::fromWCharArray(requestedData,wcslen(requestedData));
    }
    else
    {
        Logger::logError(QString("WinDeviceHelper::getDeviceRegistryString: SetupDiGetDeviceRegistryPropertyW failed with error %1").arg(GetLastError()));
    }
    delete[]requestedData;
    return (result==TRUE );

}

bool WinDeviceHelper::getVendorAndDeviceIds(HDEVINFO hDevInfoSet,SP_DEVINFO_DATA &devInfo,QString& vendorId, QString& deviceId)
{
    QString dataStr;
    if(getDeviceRegistryString(hDevInfoSet,devInfo,SPDRP_HARDWAREID,dataStr))
    {
        dataStr=dataStr.toUpper();
        QRegExp vidpid("(VID_)[0-9A-F]{4}(&PID_)[0-9A-F]{4}");
        int pos=dataStr.indexOf(vidpid);
        if(pos>=0)
        {
            vendorId=dataStr.mid(pos+4,4);
            pos+=8;
            pos+=5;
            deviceId=dataStr.mid(pos,4);
            return true;
        }
    }

    return false;
}

部分用法

    DWORD dwGuids = 0;
    HDEVINFO hDevInfoSet = getDevInfoForClass(drvClass,dwGuids);
    //Logger::logTrace(QString("WinDeviceHelper::searchForPort() found %1 port drivers for type %2").arg(dwGuids).arg(drvClass));
    if(dwGuids)
    {
        BOOL bMoreItems = TRUE;
        int nIndex = 0;

        SP_DEVINFO_DATA devInfo;
        devInfo.cbSize = sizeof( SP_DEVINFO_DATA );

        while( SetupDiEnumDeviceInfo( hDevInfoSet, nIndex, &devInfo ) && ( nIndex != -1 ) )
        {
            //Logger::logTrace(QString("WinDeviceHelper::searchForPort() enumerating ports. current index: %1").arg(nIndex));
            QString iVid,iPid;
            QString fName;

            if( getVendorAndDeviceIds(hDevInfoSet,devInfo,iVid,iPid)
              enter code here

        }
    }

关于c++ - 如何在 C++ 中获取 Windows 中的设备属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5989993/

相关文章:

objective-c - Objective-C - 自定义 @synthesize?

java - 按位非运算符

c++ - 有没有一种在转换后使用 views::filter 的有效方法? (范围适配器)

delphi - GotoXY 实现

objective-c - 属性需要定义方法

JavaScript 属性最终会陷入循环

c++ - 在 libclang 中获取类型的不合格版本

c++ - 具有多重继承的类的 sizeof

c++ - windows C++ opening printer with documentproperties get C6836 "Write Overrun"代码分析警告

c++ - 是否需要删除渲染上下文并销毁设备上下文?