码迷,mamicode.com
首页 > Windows程序 > 详细

C#操作电脑多显示器设置

时间:2019-12-24 20:53:48      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:private   top   获取   设置屏幕   case   inter   static   不同   sys   

电脑多显示器设置

第一种方式

通过使用api函数SetDisplayConfig来设置。这种方式在某些电脑中设置有几率会导致电脑黑屏

使用代码如下:

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("user32.dll", CharSet = CharSet.Unicode)]
private static extern long SetDisplayConfig(uint numPathArrayElements, IntPtr pathArray, uint numModeArrayElements, IntPtr modeArray, uint flags);

/// <summary>
/// 设置屏幕的显示模式
/// </summary>
/// <param name="type">模式(0 - 主屏  1 - 双屏复制  2 - 双屏扩展  3 - 第二屏幕</param>
/// <returns></returns>
public static void SetScreenMode(int type)
{
    uint smode;

    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, IntPtr.Zero, 0, IntPtr.Zero, smode);
}

第二种方式

使用系统自带的displayswitch.exe,该文件在C:\Windows\System32\DisplaySwitch.exe中,可以使用Process来调用cmd.exe来执行displaySwitch.exe带参数的命令,当然你也可以直接执行已写好脚本的.bat文件。

其中包含的参数示意:

仅电脑屏幕 displayswitch /internal

复制 displayswitch /clone

扩展 displayswitch /extend

仅第二屏幕 displayswitch /external

示例代码如下:

 public enum DisplaySwitchEnum
 {
     Default,
     /// <summary>
     /// 仅电脑屏幕
     /// </summary>
     Internal,
     /// <summary>
     /// 复制屏
     /// </summary>
     Clone,
     /// <summary>
     /// 扩展屏
     /// </summary>
     Extend,
     /// <summary>
     /// 仅第二屏幕
     /// </summary>
     External
 }
public static void DisplaySwitch(DisplaySwitchEnum displaySwitch)
{
    Process process = new Process();
    string str = Environment.GetEnvironmentVariable("windir");//获取系统目录
    string dir = "System32";
    if (!Environment.Is64BitProcess)
    {
        dir = "SysNative";//非64位进程的使用这个目录
    }
    process.StartInfo.WorkingDirectory = System.IO.Path.Combine(str, dir);

    process.StartInfo.FileName = "cmd.exe";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardInput = true;
    process.StartInfo.CreateNoWindow = true;
    process.Start();
    string cmd = string.Empty;
    switch (displaySwitch)
    {
        case DisplaySwitchEnum.Clone:
            cmd = "displayswitch.exe /clone";
            break;
        case DisplaySwitchEnum.Extend:
            cmd = "displayswitch.exe /extend";
            break;
        case DisplaySwitchEnum.External:
            cmd = "displayswitch.exe /external";
            break;
        case DisplaySwitchEnum.Internal:
            cmd = "displayswitch.exe /internal";
            break;
    }
    process.StandardInput.WriteLine(cmd);
    process.Close();
}

其中需要特别注意的点是Process的WorkingDirectory的设置。在 x64版本的 Windows 操作系统下,会自动将 System32 的操作导引到 SysWOW64,所以在代码中我增加了判断当前应用程序来区分使用不同的系统目录。

在x86应用在64位系统下使用C:\windows\SysNative就能正常引导到C:\windows\system32目录

C#操作电脑多显示器设置

标签:private   top   获取   设置屏幕   case   inter   static   不同   sys   

原文地址:https://www.cnblogs.com/zzr-stdio/p/12093159.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!