C++写出完整代码,使用SetupDiGetDeviceRegistryProperty获取类名=monitor的信息
时间: 2024-10-13 16:07:00 浏览: 34
QT使用SetupDiGetClassDevs和SetupDiEnumDeviceInfo获取设备管理器详细信息示例
在C++中,使用`SetupDiGetDeviceRegistryProperty`可以从设备注册表中获取关于监视器(class name = monitor)的信息。以下是一个简单的示例,假设我们已经获得了设备的设备实例句柄(HDEVINFO):
```cpp
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
std::string getClassAndNameFromDevice(HDEVINFO hDevInfo, SP_DEVINFO_DATA devInfoData, SP_KEY_PROPERTY_ID propId)
{
DWORD dwSize = 0;
PCTSTR pszValue = NULL;
// 获取属性值的大小
if (SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, SPDRP_CLASS, NULL, NULL, &dwSize, NULL) != ERROR_SUCCESS) {
// 处理获取属性大小失败的情况
return "";
}
//动态分配内存以存储字符串
pszValue = new TCHAR[dwSize + 1];
// 如果内存分配失败,返回空字符串
if (!pszValue) {
std::cerr << "Failed to allocate memory for property value." << std::endl;
return "";
}
// 获取属性值
if (SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, SPDRP_CLASS, NULL, (PBYTE)pszValue, &dwSize, NULL) != ERROR_SUCCESS) {
delete[] pszValue;
return "";
}
// 将字符串转换为宽字符以便处理
std::wstring className(pszValue);
// 获取设备名称
dwSize = 0;
if (SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, SPDRP_FRIENDLYNAME, NULL, NULL, &dwSize, NULL) != ERROR_SUCCESS) {
delete[] pszValue;
return "";
}
pszValue = new TCHAR[dwSize + 1];
if (!pszValue) {
delete[] pszValue;
return "";
}
std::wstring deviceName(pszValue);
delete[] pszValue;
// 返回类名和设备名组成的字符串
return L"Class: " + className + L", Device Name: " + deviceName;
}
int main()
{
// ... 在此处设置已获取的设备实例句柄 hDevInfo ...
SP_DEVINFO_DATA devInfoData = { sizeof(SP_DEVINFO_DATA) };
SP_KEY_PROPERTY_ID propId = { SPDRP_CLASS };
// 遍历设备列表
for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &devInfoData); ++i) {
std::string result = getClassAndNameFromDevice(hDevInfo, devInfoData, propId);
if (!result.empty()) {
std::cout << result << std::endl;
}
}
return 0;
}
```
这个示例首先获取设备的类名,然后获取设备的友好名称,并将两者组合在一起返回。你需要根据实际需要调整这部分代码。
阅读全文