簡體   English   中英

以編程方式斷開和重新連接顯示

[英]Disconnect and Reconnect Displays Programmatically

問題:以編程方式以編程方式斷開連接和重新連接顯示的最佳方法是什么?

目標:在顯示器上殺死視頻輸出(沒有背光的黑屏),然后再將其重新打開。 想象一下,從顯示器上拔下視頻線,然后將其重新插入。

我的嘗試:

// 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屏幕分辨率屬性

筆記:

  • 關閉所有顯示器上的視頻輸出將無法工作,因為我需要其他顯示器保持打開狀態。
  • “死”顯示屏上的桌面區域在關閉時無需使用。 此外,如果窗戶四處移動也沒關系。

參考文獻:

  1. SO:啟用第二個監視器
  2. 如何關閉顯示器

有一個github項目,我仍然沒有,但它是一個起點。 您需要使用Win7特定的API才能更改設置 ChangeDisplaySettings無效。

看看: https//github.com/ChrisEelmaa/MultiMonitorHelper

這是你需要做的:

更新IDisplay接口以支持TurnOff()方法,

然后調用它:

var displayModel = DisplayFactory.GetDisplayModel();
var displayList = displayModel.GetActiveDisplays().ToList();
var firstDisplay = displayList[0].TurnOff();

如何實現TurnOff()? 我想象這就是(我現在可能在這里錯了):

您需要通過打破“路徑”來打破GPU和監視器之間的連接。 你可以像這樣打破源和目標之間的路徑:

調用SetDisplayConfig ()並傳遞特定路徑,並確保從DISPLAY_PATH_INFO結構標記整數中映射出DISPLAYCONFIG_PATH_ACTIVE

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

很抱歉沒有更多的幫助,但這是非常核心的東西,我花了很長時間甚至了解該API的基礎知識。 這是一個起點:-),

看看如何在Win7中旋轉特定監視器的示例: 如何在Windows 7中設置監視器方向?

老實說,只需將DisplaySwitch.exe包裝為Win7,然后傳遞/ internal或/ external(取決於您是否要禁用/啟用第一個/第二個監視器),這可能適用於> 2個監視器,也可能不適用。

1)從這里獲取MultiMonitorHelperhttps//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重新連接顯示

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)更新IDisplay中的方法。

5)實施方法:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM