zoukankan      html  css  js  c++  java
  • C#操作电脑多显示器设置

    电脑多显示器设置

    第一种方式

    通过使用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:WindowsSystem32DisplaySwitch.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:windowsSysNative就能正常引导到C:windowssystem32目录

  • 相关阅读:
    错误error: Exception at 0x613baa14, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance)的解决办法
    android项目在eclipse下编译运行的问题
    关于Eigen库在Visual Studio2013中传参对齐报错问题
    实时控制软件设计大作业总结
    实时软件控制成员任务分配进度表
    实时控制软件设计第三次作业
    实时控制软件设计第二次作业
    实时软件控制设计第一次作业
    《构建之法:现代软件工程》第一章读书笔记
    组员名单
  • 原文地址:https://www.cnblogs.com/zzr-stdio/p/12093159.html
Copyright © 2011-2022 走看看