2013-05-01 81 views
3

我相信我需要一個在SetDisplayConfig()中做這個的例子。如何設置Windows-7的主監視器,在C#

我的Windows-7系統有兩個顯示器。當我的程序處於一種模式時,第一臺顯示器必須打開並且爲主,第二臺顯示器關閉。在另一種模式下,反之亦然:第一臺顯示器關閉,第二臺顯示器打開並顯示。

我已經搜索並搜索瞭如何使用Windows SDK函數「SetDisplayConfig()」,但沒有發現任何東西。 MSDN對SetDisplayConfig()的引用對我來說太深奧了,並且沒有示例代碼。

我得到它使用ChangeDisplaySettingsEx(),但這個功能在Windows-7中是片狀的。

謝謝!

+0

看到我的答案在重複的問題:http://stackoverflow.com/questions/16342757/how-can-i-temporarily-blank-a-windows-7-2nd-display-monitor-in- C – Xaruth 2013-05-06 11:35:04

回答

3

我目前擺弄SetDisplayConfig()ChangeDisplaySettingsEx()以及發現這似乎與我的設置。 SDC_TOPOLOGY_INTERNALSDC_TOPOLOGY_EXTERNAL指Windows決定您的主(屏幕)和輔助(投影機)顯示器,類似於您的印刷機的顯示器選擇 + P。這是我的另一種方式,所以你必須檢查你的配置中是否有正確的配置。然後,您只需撥打InternalDisplay()ExternalDisplay()即可激活該功能並自動關閉另一個功能。爲了完整起見,我添加了克隆和擴展設置。

[DllImport("user32.dll", CharSet = CharSet.Unicode)] 
private static extern long SetDisplayConfig(uint numPathArrayElements, 
IntPtr pathArray, uint numModeArrayElements, IntPtr modeArray, uint flags); 

UInt32 SDC_TOPOLOGY_INTERNAL = 0x00000001; 
UInt32 SDC_TOPOLOGY_CLONE = 0x00000002; 
UInt32 SDC_TOPOLOGY_EXTEND = 0x00000004; 
UInt32 SDC_TOPOLOGY_EXTERNAL = 0x00000008; 
UInt32 SDC_APPLY = 0x00000080; 

public void CloneDisplays() { 
    SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, (SDC_APPLY | SDC_TOPOLOGY_CLONE)); 
} 

public void ExtendDisplays() { 
    SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, (SDC_APPLY | SDC_TOPOLOGY_EXTEND)); 
} 

public void ExternalDisplay() { 
    SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, (SDC_APPLY | SDC_TOPOLOGY_EXTERNAL)); 
} 

public void InternalDisplay() { 
    SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, (SDC_APPLY | SDC_TOPOLOGY_INTERNAL)); 
}