2014-10-02 6 views
3

Вопрос: Каков наилучший способ программно отключить и повторно подключить дисплеи программно?Программные разъемы для подключения и повторного подключения

Цель: Убейте видеовыход (черный экран без подсветки) на дисплее, а затем снова включите его. Представьте себе, отсоединив видеокабель от монитора, а затем подключить его обратно в

Моя попытка:.

// Get the monitor to disable 
uint iDevNum = 0; 
DISPLAY_DEVICE displayDevice = new DISPLAY_DEVICE(); 
displayDevice.cb = Marshal.SizeOf(displayDevice); 
EnumDisplayDevices(null, iDevNum, ref displayDevice, 0)) 

DEVMODE devMode = new DEVMODE(); 
EnumDisplaySettings(displayDevice.DeviceName, 0, ref devMode); 

// 
// Do something here to disable this display device! 
// 

// Save the display settings 
ChangeDisplaySettingsEx(displayDevice.DeviceName, ref devMode, 
    IntPtr.Zero, ChangeDisplaySettingsFlags.CDS_NONE, IntPtr.Zero); 

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

Это похоже на "Отключить этот дисплей" в свойствах Разрешение экрана в Windows 7:

Windows 7 Screen Resolution Properties

Примечания:

  • Выключение видеовыхода на все дисплеи выиграли» т, потому что мне нужны другие мониторы, чтобы оставаться на месте.
  • Рабочий стол на «мертвом» дисплее НЕ должен использоваться, когда он выключен. Кроме того, это нормально, если окна перемещаются.

Ссылки:

  1. SO: Enabling a Second Monitor
  2. How to Turn Off a Monitor

ответ

1

1) Получить MultiMonitorHelper здесь: https://github.com/ChrisEelmaa/MultiMonitorHelper/tree/master

2) Продлить Win7Display для отключения На дисплее:

using MultiMonitorHelper.DisplayModels.Win7.Enum; 
using MultiMonitorHelper.DisplayModels.Win7.Struct; 

/// <summary> 
/// Disconnect a display. 
/// </summary> 
public void DisconnectDisplay(int displayNumber) 
{ 
    // Get the necessary display information 
    int numPathArrayElements = -1; 
    int numModeInfoArrayElements = -1; 
    StatusCode error = CCDWrapper.GetDisplayConfigBufferSizes(
     QueryDisplayFlags.OnlyActivePaths, 
     out numPathArrayElements, 
     out numModeInfoArrayElements); 

    DisplayConfigPathInfo[] pathInfoArray = new DisplayConfigPathInfo[numPathArrayElements]; 
    DisplayConfigModeInfo[] modeInfoArray = new DisplayConfigModeInfo[numModeInfoArrayElements]; 
    error = CCDWrapper.QueryDisplayConfig(
     QueryDisplayFlags.OnlyActivePaths, 
     ref numPathArrayElements, 
     pathInfoArray, 
     ref numModeInfoArrayElements, 
     modeInfoArray, 
     IntPtr.Zero); 
    if (error != StatusCode.Success) 
    { 
     // QueryDisplayConfig failed 
    } 

    // Check the index 
    if (pathInfoArray[displayNumber].sourceInfo.modeInfoIdx < modeInfoArray.Length) 
    { 
     // Disable and reset the display configuration 
     pathInfoArray[displayNumber].flags = DisplayConfigFlags.Zero; 
     error = CCDWrapper.SetDisplayConfig(
      pathInfoArray.Length, 
      pathInfoArray, 
      modeInfoArray.Length, 
      modeInfoArray, 
      (SdcFlags.Apply | SdcFlags.AllowChanges | SdcFlags.UseSuppliedDisplayConfig)); 
     if (error != StatusCode.Success) 
     { 
      // SetDisplayConfig failed 
     } 
    } 
} 

3) Продлить Win7Display, чтобы восстановить дисплей, используя ответ от this post:

using System.Diagnostics; 

/// <summary> 
/// Reconnect all displays. 
/// </summary> 
public void ReconnectDisplays() 
{ 
    DisplayChanger.Start(); 
} 

private static Process DisplayChanger = new Process 
{ 
    StartInfo = 
    { 
     CreateNoWindow = true, 
     WindowStyle = ProcessWindowStyle.Hidden, 
     FileName = "DisplaySwitch.exe", 
     Arguments = "/extend" 
    } 
}; 

4) Update методы в IDisplay.

5) Реализовать методы:

IDisplayModel displayModel = DisplayFactory.GetDisplayModel(); 
List<IDisplay> displayList = displayModel.GetActiveDisplays().ToList(); 

displayList[0].DisconnectDisplay(0); 
displayList[0].ReconnectDisplays(); 
+1

'CCDWrapper' теперь просто' Wrapper' в пространстве имен CCD. – danielcooperxyz

1

Там в GitHub проект, который я до сих пор не удосужился, но это отправная точка. Чтобы изменить настройки, вам необходимо использовать API-интерфейс Win7. ChangeDisplaySettings не будет работать.

Посмотрите:() метод,

, а затем вызвать его

обновление интерфейса IDisplay для поддержки TurnOFF::

var displayModel = DisplayFactory.GetDisplayModel(); 
var displayList = displayModel.GetActiveDisplays().ToList(); 
var firstDisplay = displayList[0].TurnOff(); 
https://github.com/ChrisEelmaa/MultiMonitorHelper

Это то, что вам нужно сделать

Как реализовать TurnOff()? Я бы предположил, что это так (я могу быть не так сейчас):

Вам необходимо разорвать соединение между монитором GPU &, пробив «дорожки». Вы можете разбить путь между источником и целью, как это:

вызова SetDisplayConfig() и передать в конкретных путях и убедитесь, что вы наметить DISPLAYCONFIG_PATH_ACTIVE из DISPLAY_PATH_INFO структуры флагов целочисленных.

http://msdn.microsoft.com/en-us/library/windows/hardware/ff553945(v=vs.85).aspx

Извините за не более полезным, но это довольно хардкорный материал, мне потребовалось некоторое время, чтобы понять даже основы этого API. Это отправная точка :-),

посмотрит на примере, как повернуть конкретный монитор в Win7: How do I set the monitor orientation in Windows 7?

Честно говоря, просто обернуть DisplaySwitch.exe для Win7, и передать/внутренний или/external (в зависимости от того, хотите ли вы отключить/включить первый/второй монитор), это может работать или не работать для> 2 мониторов.