WMI Получить все мониторы не возвращает все мониторы - PullRequest
9 голосов
/ 14 сентября 2009

Я использую WMI Win32_MonitorDesktop для получения всей информации о мониторах в системе.

Однако возвращается только один. Я пробовал это на нескольких компьютерах, и у них определенно есть несколько мониторов, подключенных и работающих.

ManagementObjectSearcher monitorObjectSearch = new ManagementObjectSearcher("SELECT * FROM Win32_DesktopMonitor");

foreach (ManagementObject monitor in monitorObjectSearch.Get())
{
      Debug.WriteLine(monitor["Description"]);
}

Кто-нибудь знает, почему мне возвращают только 1 монитор?

Также, если я назначу возвращаемое значение monitorObjectSearch.Get () переменной, я не смогу оценить свойство Count в ближайшем окне, так как функция всегда отключается.

Ответы [ 4 ]

1 голос
/ 22 апреля 2016

Я попытался решить эту проблему с помощью WMI на многих системах (от WinXP-SP3 до Win10), и на разных машинах я получил разные результаты. Есть две таблицы, в которых можно сохранить текущие настройки монитора. Первый - Win32_DesktopMonitor в cimv2 пространстве имен, второй - WMIMonitorID в wmi пространстве имен. Если одна из них имеет только одну запись (в настройках нескольких дисплеев), то вторая будет иметь все записи.

Затем, чтобы получить имя драйвера монитора, нужно найти устройства с PnPDeviceID, найденным в записях из этих таблиц в таблице Win32_PnPEntity , в пространстве имен cimv2 . Вы можете проверить образец решения здесь .

1 голос
/ 14 сентября 2009

Может быть, мониторы настроены в режиме горизонтального диапазона (карты NV и ATI), которые эффективно превращают несколько настроек монитора в один большой монитор? Иначе я продолжу думать ..

Кроме того, MSDN совершенно определенно заявляет , что если этот вызов WMI используется с какими-либо предварительными данными, он даст неточные результаты!

0 голосов
/ 24 апреля 2016

Это, конечно, не отвечает на ваш фактический вопрос, но самый надежный способ выяснить информацию о мониторе - это прочитать следующий реестр:

"SYSTEM\CurrentControlSet\Enum\DISPLAY\"

под HKEY_LOCAL_MACHINE

0 голосов
/ 30 декабря 2010

Я использую тот же код из wmi (win32_Desktopmonitor) на машине с Windows 7. Там это тоже не работает, в том смысле, что возвращается только 1 монитор, а на самом деле их два.

Также Screen.Allscreens.Length, возвращает только 1 монитор. Единственный способ заставить систему вернуть 2 монитора - это расширить рабочий стол до двух мониторов, но большинство людей этого не делают.

...