如何在Qt中获取设备管理器内网络适配器的‘设备描述’?
在Qt中获取Windows设备管理器网络适配器的设备描述
当然可以实现啦!Qt本身没有直接提供读取Windows设备管理器硬件信息的专属类,但咱们可以结合Win32 API来搞定这个需求——毕竟Windows的设备信息都存在系统注册表和设备数据库里,用系统API就能轻松拿到。
实现思路
核心是调用Windows的设备安装API(SetupAPI),通过以下几个关键函数来获取网络适配器的设备描述:
SetupDiGetClassDevs:获取网络设备类的所有已连接设备的信息集合SetupDiEnumDeviceInfo:遍历集合里的每一个设备SetupDiGetDeviceRegistryProperty:读取指定设备的“设备描述”属性
具体代码实现
1. 配置项目
首先在Qt项目的.pro文件里添加链接库:
LIBS += -lsetupapi
2. 编写获取函数
以下是完整的可复用函数,直接放到你的Qt类里就能用:
#include <windows.h> #include <setupapi.h> #include <QStringList> #ifdef Q_OS_WINDOWS QStringList getNetworkAdapterDescriptions() { QStringList adapterDescriptions; // 获取当前存在的网络设备类集合 HDEVINFO deviceInfoSet = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE); if (deviceInfoSet == INVALID_HANDLE_VALUE) { return adapterDescriptions; } SP_DEVINFO_DATA deviceData = {0}; deviceData.cbSize = sizeof(SP_DEVINFO_DATA); // 遍历每个网络设备 for (DWORD idx = 0; SetupDiEnumDeviceInfo(deviceInfoSet, idx, &deviceData); ++idx) { TCHAR descBuffer[MAX_PATH] = {0}; // 读取设备描述属性(SPDRP_DEVICEDESC对应设备管理器里的"设备描述") if (SetupDiGetDeviceRegistryProperty(deviceInfoSet, &deviceData, SPDRP_DEVICEDESC, NULL, reinterpret_cast<PBYTE>(descBuffer), sizeof(descBuffer), NULL)) { #ifdef UNICODE adapterDescriptions.append(QString::fromWCharArray(descBuffer)); #else adapterDescriptions.append(QString::fromLocal8Bit(descBuffer)); #endif } } // 释放资源 SetupDiDestroyDeviceInfoList(deviceInfoSet); return adapterDescriptions; } #endif
3. 调用示例
在你的业务代码里直接调用这个函数,就能拿到所有网络适配器的设备描述了:
QStringList adapters = getNetworkAdapterDescriptions(); for (const QString& desc : adapters) { qDebug() << "网络适配器描述:" << desc; }
注意事项
- 这段代码仅适用于Windows平台,用
Q_OS_WINDOWS宏包裹可以保证你的项目在其他平台编译不受影响 - 如果需要获取更多设备信息(比如制造商、硬件ID),只需要修改
SetupDiGetDeviceRegistryProperty的第三个参数,比如SPDRP_MFG对应制造商,SPDRP_HARDWAREID对应硬件ID - 确保你的程序有足够的权限读取设备信息(一般普通用户权限就足够,但某些特殊设备可能需要管理员权限)
内容的提问来源于stack exchange,提问作者cnm
相关产品推荐
相关产品推荐

