2016-05-20 9 views
1

Я создаю простую программу, которая, когда она запускается, будет отображать разные компьютерные компоненты.Как использовать WMI для получения информации о мониторе для всех подключенных мониторов?

Сейчас я пытаюсь показать все подключенные мониторы. Имя каждого и общее количество подключено к компьютеру.

Когда я запускаю приведенный ниже код, он показывает мне только имя одного монитора, хотя я подключен к трем. Может кто-нибудь, пожалуйста, скажите мне, почему.

public static List<string> GetMonitorNames() 
{ 
    ManagementClass mc = new ManagementClass("Win32_DesktopMonitor"); 
    ManagementObjectCollection moc = mc.GetInstances(); 
    var info = new List<string>(); 
    foreach (ManagementObject mo in moc) 
    { 
     info.Add(mo["Name"].ToString()); 
    } 
    return info; 
} 

ответ

1

Вы можете получить имена экземпляров всех monitiors с использованием метода WmiMonitorBasicDisplayParams.

Вот пример

public static List<string> GetMonitorNames() 
{ 
    ManagementObjectSearcher searcher = 
      new ManagementObjectSearcher("root\\WMI", 
      "SELECT * FROM WmiMonitorBasicDisplayParams"); 
    var info = new List<string>(); 
    foreach (ManagementObject queryObj in searcher.Get()) { 
     info.Add(queryObj["InstanceName"].ToString()); 
    } 
    return info; 
} 

Пример вывода из моей машины и доступных свойств этого объекта

Active      : True 
DisplayTransferCharacteristic : 120 
InstanceName     : DISPLAY\HWP3270\4&7563392&0&UID16843008_0 
MaxHorizontalImageSize  : 52 
MaxVerticalImageSize   : 32 
SupportedDisplayFeatures  : WmiMonitorSupportedDisplayFeatures 
VideoInputType    : 0 
PSComputerName    : 

Active      : True 
DisplayTransferCharacteristic : 120 
InstanceName     : DISPLAY\HWP326E\4&7563392&0&UID53349120_0 
MaxHorizontalImageSize  : 52 
MaxVerticalImageSize   : 32 
SupportedDisplayFeatures  : WmiMonitorSupportedDisplayFeatures 
VideoInputType    : 1 
PSComputerName    : 
+0

Я вижу, что вы там делали, но есть много * результатов google для WMI, возвращающих только один экземпляр. Вы уверены, что это работает? –

+0

Я не делал никаких проверок его кода и получения информации о мониторе, просто показывая, что если он выполняет итерацию коллекции, чтобы получить все, что ему потребуется, чтобы использовать коллекцию и не перезаписывать значение каждый раз – bhmahler

+0

Когда я использую это, я получаю не могу конвертировать тип System.collections.Generic.List в строку. Эта ошибка возникает в этом коде 'lblMon.Text = HardwareInfo.GetMonitorNames();' – KevinM1990112qwq

2

не прямой ответ на вопрос, поставленный, но вместо того, откладывая к WMI, почему бы не использовать решение, доступное вам в .net, например, это решение Winforms:

using System.Diagnostics; 
using System.Windows.Forms; 

Debug.Print("Total Number Of Monitors: {0}", Screen.AllScreens.Length); 
foreach (Screen scr in Screen.AllScreens) 
{ 
    Debug.Print(scr.DeviceName); 
} 

Для того, чтобы выяснить, на основе ваших комментариев, да этот метод может быть использован внутри статического метода, как:

public static List<string> GetAllMonitorNames() 
{ 
    List<string> result = new List<string>(); 
    foreach (Screen scr in Screen.AllScreens) 
    { 
     result.Add(scr.DeviceName); 
    } 
    return result; 
} 

или с помощью LINQ, если вы предпочитаете:

public static IEnumerable<string> GetAllMonitorNames() => 
      Screen.AllScreens.Select((s) => s.DeviceName); 

Вы также можете еще раз P/Вызовите API EnumDisplayMonitors и добавьте отображаемые имена в список. (pinvoke.net example)

+0

Опять же, я довольно новичок в этом. Могу ли я изменить этот код, чтобы поместить его в мои общедоступные статические GetMonitorNames() ;? Значит, я могу назвать это с лейбла? – KevinM1990112qwq

+0

@ KevinM1990112qwq: вам нужно укрепить свои знания о том, как работать с коллекциями и струнами, спортом. Бхмахлер уже показал вам, как это сделать в его ответе. –

+0

Итак, добавление этого ответа будет работать так же, как BH показал мне? Извините, и спасибо за ответ. – KevinM1990112qwq