public class ScreenDisplaySetting
{
private const uint SDC_APPLY = 0x00000080;
private const uint SDC_TOPOLOGY_INTERNAL = 0x00000001;
private const uint SDC_TOPOLOGY_CLONE = 0x00000002;
private const uint SDC_TOPOLOGY_EXTERNAL = 0x00000008;
private const uint SDC_TOPOLOGY_EXTEND = 0x00000004;
[DllImport("", CharSet = )]
private static extern long SetDisplayConfig(uint numPathArrayElements, IntPtr pathArray, uint numModeArrayElements, IntPtr modeArray, uint flags);
[DllImport("")]
public static extern Int32 GetDisplayConfigBufferSizes(UInt32 Flags,
out UInt32 NumPathArrayElements, out UInt32 NumModeInfoArrayElements);
[DllImport("")]
public static extern Int32 QueryDisplayConfig(UInt32 Flags,
[In, Out] ref UInt32 NumPathArrayElements, IntPtr pPathInfoArray,
[In, Out] ref UInt32 NumModeInfoArrayElements, IntPtr pModeInfoArray,
out UInt32 CurrentTopologyId);
/// <summary>
/// 设置屏幕的显示模式
/// </summary>
/// <param name="type">模式(0 - 主屏 1 - 双屏复制 2 - 双屏扩展 3 - 第二屏幕</param>
/// <returns></returns>
public static void SetScreenMode(int type)
{
uint smode;
[] screens = ;
//其他屏幕显示,这里假设有2个
var subScreen = (from o in screens where == false select o).ToList<>();
if ( <= 0) return;
switch (type)
{
case 0:
smode = SDC_APPLY | SDC_TOPOLOGY_INTERNAL;
break;
case 1:
smode = SDC_APPLY | SDC_TOPOLOGY_CLONE;//复制模式
break;
case 2:
smode = SDC_APPLY | SDC_TOPOLOGY_EXTEND;//扩展模式
break;
case 3:
smode = SDC_APPLY | SDC_TOPOLOGY_EXTERNAL;
break;
default:
smode = SDC_APPLY | SDC_TOPOLOGY_INTERNAL;
break;
}
SetDisplayConfig(0, , 0, , smode);
}
/// <summary>
/// 读取屏幕投影模式,读取不成功,暂不用
/// </summary>
public static void GetScreenMode()
{
UInt32 NumPathArrayElements = 0;
UInt32 NumModeInfoArrayElements = 0;
Int32 RetVal;
RetVal = GetDisplayConfigBufferSizes(0, out NumPathArrayElements, out NumModeInfoArrayElements);
IntPtr pPathArray = (4096);
IntPtr pModeArray = (4096);
UInt32 CurrentTopologyId = 0;
RetVal = QueryDisplayConfig(0, ref NumPathArrayElements, pPathArray, ref NumModeInfoArrayElements, pModeArray, out CurrentTopologyId);
}
}