gpt4 book ai didi

c++ - EnumDisplayDevices vs WMI Win32_DesktopMonitor,如何检测事件监视器?

转载 作者:可可西里 更新时间:2023-11-01 12:43:03 31 4
gpt4 key购买 nike

对于我当前的 C++ 项目,我需要为在大量计算机上连接并处于事件状态的每个监视器检测一个唯一的字符串。

研究指出了两种选择

  1. 使用 WMI 并查询 Win32_DesktopMonitor 以获取所有事件监视器。使用 PNPDeviceID 来唯一标识监视器。

  2. 使用 EnumDisplayDevices API,向下挖掘以获取设备 ID。

我对使用设备 ID 进行唯一型号标识很感兴趣,因为使用默认即插即用驱动程序的显示器将报告通用字符串作为显示器名称“默认即插即用显示器”

我一直在使用 WMI 方法时遇到问题,它似乎只在我的 Vista 机器上返回 1 个显示器,查看 doco 结果表明它在非 WDDM 设备上无法按预期工作。

EnumDisplayDevices 从后台服务(尤其是在 Vista 上)运行时似乎有点问题,如果它在 session 0 中,它将不返回任何信息。

  • 有没有其他人必须做类似的事情(为所有连接的事件监视器找到唯一的模型字符串?)

  • 哪种方法效果最好?

最佳答案

这是我目前正在进行的代码,用于可靠地检测监视器设备 ID。

CString DeviceID;
DISPLAY_DEVICE dd;
dd.cb = sizeof(dd);
DWORD dev = 0;
// device index
int id = 1;
// monitor number, as used by Display Properties > Settings

while (EnumDisplayDevices(0, dev, &dd, 0))
{
DISPLAY_DEVICE ddMon;
ZeroMemory(&ddMon, sizeof(ddMon));
ddMon.cb = sizeof(ddMon);
DWORD devMon = 0;

while (EnumDisplayDevices(dd.DeviceName, devMon, &ddMon, 0))
{
if (ddMon.StateFlags & DISPLAY_DEVICE_ACTIVE &&
!(ddMon.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER))
{
DeviceID.Format (L"%s", ddMon.DeviceID);
DeviceID = DeviceID.Mid (8, DeviceID.Find (L"\\", 9) - 8);
}
devMon++;

ZeroMemory(&ddMon, sizeof(ddMon));
ddMon.cb = sizeof(ddMon);
}

ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
dev++;
}

关于c++ - EnumDisplayDevices vs WMI Win32_DesktopMonitor,如何检测事件监视器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/181064/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com