2016-05-28 3 views
2

Приветствуем всех новых пользователей на stackoverflow.com. Не знаете, как задать вопрос здесь, но приложите все усилия. Сделано, довольно немного исследований по теме, но не удалось найти ни одной вещи, чтобы разрешить обнаружение.Display Count (Inc. Disabled Displays)

Пример: Попытка определить количество активных и отключенных дисплеев в системах Windows 7-10.

код GPU [Доступность]:

 private int MonCount; 
    [DllImport("User32.dll")] 
    private static extern bool EnumDisplayDevices(
     string lpDevice, int iDevNum, 
     ref DISPLAY_DEVICE lpDisplayDevice, int dwFlags); 

    [StructLayout(LayoutKind.Sequential)] 
    public struct DISPLAY_DEVICE 
    { 
     public int cb; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
     public string DeviceName; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
     public string DeviceString; 
     public int StateFlags; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
     public string DeviceID; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
     public string DeviceKey; 

     public DISPLAY_DEVICE(int flags) 
     { 
      cb = 0; 
      StateFlags = flags; 
      DeviceName = new string((char)32, 32); 
      DeviceString = new string((char)32, 128); 
      DeviceID = new string((char)32, 128); 
      DeviceKey = new string((char)32, 128); 
      cb = Marshal.SizeOf(this); 
     } 
    } 
    public void MonitorCheck() 
    { 
     DISPLAY_DEVICE lpDisplayDevice = new DISPLAY_DEVICE(0);  // OUT 
     DISPLAY_DEVICE monitor_name = new DISPLAY_DEVICE(0);  // OUT 

     int devNum = 0; 
     while (EnumDisplayDevices(null, devNum, ref lpDisplayDevice, 0)) 
     { 

      listBox1.Items.Add("\ndevNum =" + devNum); 
      listBox1.Items.Add("cb =" + lpDisplayDevice.cb); 
      listBox1.Items.Add("DeviceID =" + lpDisplayDevice.DeviceID); 
      listBox1.Items.Add("DeviceKey =" + lpDisplayDevice.DeviceKey); 
      listBox1.Items.Add("DeviceName =" + lpDisplayDevice.DeviceName.Trim()); 
      listBox1.Items.Add("DeviceString =" + lpDisplayDevice.DeviceString.Trim()); 
      // Show monitor name: 
      EnumDisplayDevices(lpDisplayDevice.DeviceName, 0, ref monitor_name, 0); 
      listBox1.Items.Add("Monitor name =" + monitor_name.DeviceString.Trim()); 
      ++devNum; 
     } 
    } 

Источник: C# how to get the Windows monitor name

Возврат: Все привязные мониторы по графической информации адаптер. Граф всегда зависит от количества мониторов, которые можно подключить к адаптеру дисплея.

Код Активные дисплеи:

Screen.AllScreens.Count(); 

Возврат: Активный монитор счета.

Проблема:

Если GPU адаптер имеет 3 выхода: * Над GPU [Доступность] код возвращается: 3 (. Независимо от того, сколько дисплеи привязаны к нему)

Если 2 Мониторы прикрепляются (Пример: Ноутбук монитор + внешний монитор HDMI), но настройка дисплея устанавливается: Laptop только монитор (внешний монитор HDMI не активен) -> Активные Отображает код Возвращает: 1

Вопрос:

Как вернуть 2, так как есть неактивный дисплей и активный дисплей (монитор ноутбука + неактивный внешний монитор)?

Solutions:

Там в несколько идей, как справиться с этой ситуацией:

  1. Активировать все дисплеи, расширяя их и просто повторить: Screen.AllScreens.Count();

Идея: Сравнить выход GPU [Доступность] выводит и подсчитывает все, что дает любое значение как monitor_name.DeviceString.Trim() (Тем не менее, я протестировал это на рабочем столе с объявлением NVIDIA apter: результат равен нулю, но в ноутбуке адаптер Intel HD: выход всегда «Generic PnP-Monitor», поэтому это не решение).

ответ

0

Глупо мне ... Никогда, хотя использовать все 3 метода для решения проблемы. (Кажется, чертовски сложно заставить код работать в тегах кода здесь, на форумах.

  • Максимальные привязные дисплеи
  • В настоящее время присоединенные дисплеи
  • Присутствуют дисплеи

Решение:

Хм, кажется, не может быть в состоянии приложить код для StackOverflow ответ, так:

Pastebin: Monitors counting

Смежные вопросы