对于我当前的C++项目,我需要为在大量计算机上连接并处于事件状态的每个监视器检测一个唯一的字符串。
研究指出了2个选择
我对使用设备ID进行唯一模型识别感兴趣,因为使用默认即插即用驱动程序的监视器将报告通用字符串作为监视器名称“默认即插即用监视器”
我一直在遇到WMI方法的问题,看来我的Vista机器上只返回了1台显示器,看着doco证明它在非WDDM设备上无法正常工作。
从后台服务(特别是在Vista中)运行时,EnumDisplayDevices似乎有点问题,如果它在 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/