Wie kann ich Monitorinformationen abrufen?

Wie kann ich Monitorinformationen abrufen?


Ich versuche, die Monitor-IDs wie in den Windows-Anzeigeeigenschaften (Nr. 1, 2 ... usw.) abzurufen, aber ich kann anscheinend keinen Weg finden. Ich habe versucht, EnumDisplayMonitors zu verwenden sowie EnumDisplayDevices . Beide geben so etwas wie "\.\DISPLAY1" zurück. Diese Nummer stimmt jedoch nicht immer mit der von Windows angezeigten Nummer überein, insbesondere wenn 2 Grafikkarten verwendet werden, um 3 oder mehr Monitore anzusteuern. Gibt es einen API-Aufruf, den ich vermisse, um diese Informationen abzurufen, oder gibt es eine Möglichkeit, sie aus der Registrierung oder anderswo zu erhalten? Danke!


Ich habe diese Methoden ausprobiert:

Win32: EnumDisplayMonitors, EnumDisplayDevices:Keiner dieser Rückgabemonitore ist aktiv, und keiner gibt die richtigen IDs zurück.

WMI: „select * from Win32_DesktopMonitor“ gibt nicht alle Monitore zurück und es gibt keine ID.

Registrierung: Ich habe die Monitore an verschiedenen Orten gefunden, aber keiner der Orte, die ich gefunden habe, enthält die Informationen, nach denen ich suche.


Jede Hilfe wird sehr geschätzt. :)


Aktualisierung: Dies sind die Monitornummern, nach denen ich suche:


Einige Code-Antworten


std::wstring getMonitorName(HMONITOR monitor) { 	MONITORINFOEXW info;
info.cbSize = sizeof(info);
GetMonitorInfoW(monitor, &info);
UINT32 requiredPaths, requiredModes;
GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &requiredPaths, &requiredModes);
std::vector<DISPLAYCONFIG_PATH_INFO>
paths(requiredPaths);
std::vector<DISPLAYCONFIG_MODE_INFO>
modes(requiredModes);
QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &requiredPaths, paths.data(), &requiredModes, modes.data(), nullptr);
for (auto&
p : paths) { DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName;
sourceName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
sourceName.header.size = sizeof(sourceName);
sourceName.header.adapterId = p.sourceInfo.adapterId;
sourceName.header.id = p.sourceInfo.id;
DisplayConfigGetDeviceInfo(&sourceName.header);
if (wcscmp(info.szDevice, sourceName.viewGdiDeviceName) == 0) { DISPLAYCONFIG_TARGET_DEVICE_NAME name;
name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
name.header.size = sizeof(name);
name.header.adapterId = p.sourceInfo.adapterId;
name.header.id = p.targetInfo.id;
DisplayConfigGetDeviceInfo(&name.header);
return std::wstring(name.monitorFriendlyDeviceName);
} } }
EnumDisplayDevices  Device 0:
DeviceName: '\\.\DISPLAY1'
DeviceString: 'Intel(R) HD Graphics 5500'
StateFlags: desktop primary
DeviceID: 'MONITOR\SAN309A\{4d36e96e-e325-11ce-bfc1-08002be10318}\0003'
Monitor Name: 'Generic PnP Monitor' Device 1:
DeviceName: '\\.\DISPLAY2'
DeviceString: 'Intel(R) HD Graphics 5500'
StateFlags: desktop
DeviceID: 'MONITOR\LGD0468\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001'
Monitor Name: 'Generic PnP Monitor' Device 2:
DeviceName: '\\.\DISPLAY3'
DeviceString: 'Intel(R) HD Graphics 5500'
StateFlags:
DeviceID: ''
Monitor Name: '' EnumDisplayMonitors DisplayDevice: \\.\DISPLAY1 Name: LED MONITOR DisplayDevice: \\.\DISPLAY2 Name: