[英]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中屏幕分辨率屬性中的“斷開此顯示”:
筆記:
參考文獻:
有一個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)從這里獲取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以重新連接顯示 :
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.