开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 285|回复: 3
收起左侧

[已解决] 这是多显示器关闭的代码,谁能转成易代码?

 关闭 [复制链接]
结帖率:50% (3/6)
发表于 2024-3-9 11:31:29 | 显示全部楼层 |阅读模式   广东省佛山市
14精币
Finally, I created a Windows Forms app using the .NET Framework. I replaced the code in the Program.cs file and built the executable (exe) file by running the build command. To execute the extend/duplicate functionality, simply run 'switchDisplay.exe with extend' or 'switchDisplay.exe with duplicate'.

Copy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace switchDisplay
{
    internal static class Program
    {

        [Flags]
        public enum SetDisplayConfigFlags : uint
        {
            SDC_TOPOLOGY_INTERNAL = 0x00000001,
            SDC_TOPOLOGY_CLONE = 0x00000002,
            SDC_TOPOLOGY_EXTEND = 0x00000004,
            SDC_TOPOLOGY_EXTERNAL = 0x00000008,
            SDC_APPLY = 0x00000080
        }

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

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

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

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

        static void InternalDisplay()
        {
            SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, SetDisplayConfigFlags.SDC_TOPOLOGY_INTERNAL | SetDisplayConfigFlags.SDC_APPLY);
        }
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                string parameter = args[0].ToLower();

                if (parameter == "extend")
                {
                    ExtendDisplays(); // Set the display mode to extend
                }
                else if (parameter == "duplicate")
                {
                    CloneDisplays(); // Set the display mode to duplicate
                }
                else
                {
                    MessageBox.Show("Invalid parameter. Please provide either 'extend' or 'duplicate'.");
                }
            }
            else
            {
                MessageBox.Show("No parameter provided. Please provide either 'extend' or 'duplicate'.");
            }
        }
    }
}
SetDisplayConfig 函数说明:
setDisplayConfig 函数 (winuser.h)
SetDisplayConfig 函数通过以独占方式在当前会话中启用指定路径来修改显示拓扑、源和目标模式。
语法
C++
复制
LONG SetDisplayConfig(
  [in]           UINT32                  numPathArrayElements,
  [in, optional] DISPLAYCONFIG_PATH_INFO *pathArray,
  [in]           UINT32                  numModeInfoArrayElements,
  [in, optional] DISPLAYCONFIG_MODE_INFO *modeInfoArray,
  [in]           UINT32                  flags
);
参数
[in] numPathArrayElements
pathArray 中的元素数。
[in, optional] pathArray
要设置的所有显示路径的数组。 仅设置此数组中在 DISPLAYCONFIG_PATH_INFO 的标志成员中设置了 DISPLAYCONFIG_PATH_ACTIVE标志的路径。 此参数可以为 NULL。 活动路径在此数组中的显示顺序决定了路径优先级。 有关路径优先级顺序的详细信息,请参阅 路径优先级顺序。
[in] numModeInfoArrayElements
modeInfoArray 中的元素数。
[in, optional] modeInfoArray
显示源和目标模式信息的数组 (DISPLAYCONFIG_MODE_INFO 由 DISPLAYCONFIG_PATH_SOURCE_INFO 的 modeInfoIdx 成员引用的) ,以及 pathArray 中路径信息的DISPLAYCONFIG_PATH_TARGET_INFO元素。 此参数可以为 NULL。
[in] flags
标志值的按位 OR,指示此函数的行为。 此参数可以是下列值之一,也可以是以下值的组合:0 无效。 有关有效标志组合的说明,请参阅下文。
Value        含义
SDC_APPLY
0x00000080
设置生成的拓扑、源和目标模式。
SDC_NO_OPTIMIZATION
0x00000100
SDC_APPLY标志的修饰符。 这会导致更改模式一直强制到每个活动显示器的驱动程序。
SDC_USE_SUPPLIED_DISPLAY_CONFIG
0x00000020
使用 pathArray 和 modeInfoArray 参数中提供的拓扑、源和目标模式信息,而不是在数据库中查找配置。
SDC_SAVE_TO_DATABASE
0x00000200
生成的拓扑、源和目标模式将保存到数据库。
SDC_VALIDATE
0x00000040
系统测试请求的拓扑、源和目标模式信息,以确定是否可以设置它。
SDC_ALLOW_CHANGES
0x00000400
如果需要,该函数可以修改指定的源和目标模式信息,以创建功能显示路径集。
SDC_TOPOLOGY_CLONE
0x00000002
调用方从持久性数据库请求上次克隆配置。
SDC_TOPOLOGY_EXTEND
0x00000004
调用方从持久性数据库请求最后一个扩展配置。
SDC_TOPOLOGY_INTERNAL
0x00000001
调用方从持久性数据库请求最后一个内部配置。
SDC_TOPOLOGY_EXTERNAL
0x00000008
调用方从持久性数据库请求最后一个外部配置。
SDC_TOPOLOGY_SUPPLIED
0x00000010
调用方提供路径数据,因此函数仅查询持久性数据库以查找和使用源和目标模式。
SDC_USE_DATABASE_CURRENT
(SDC_TOPOLOGY_INTERNAL |SDC_TOPOLOGY_CLONE |SDC_TOPOLOGY_EXTEND |SDC_TOPOLOGY_EXTERNAL)
调用方请求所有四个SDC_TOPOLOGY_XXX配置的组合。 此值通知 API 为当前连接的监视器设置最后一个已知显示配置。
SDC_PATH_PERSIST_IF_REQUIRED
0x00000800
当函数处理SDC_TOPOLOGY_XXX请求时,它可以强制目标上的路径持久性来满足该请求(如有必要)。 有关此标志可以与之组合的其他标志的信息,请参阅以下列表。
SDC_FORCE_MODE_ENUMERATION
0x00001000
调用方请求为驱动程序提供更新 GDI 模式列表的机会,而 SetDisplayConfig 设置新的显示配置。 仅当还指定了SDC_USE_SUPPLIED_DISPLAY_CONFIG和SDC_APPLY标志值时,此标志值才有效。
SDC_ALLOW_PATH_ORDER_CHANGES
0x00002000
SDC_TOPOLOGY_SUPPLIED标志的修饰符,指示 SetDisplayConfig 在搜索数据库时应忽略所提供的拓扑的路径顺序。 设置此标志时,拓扑集是包含所有路径的最新拓扑,而不考虑路径顺序。
SDC_VIRTUAL_MODE_AWARE
0x00008000
SDC_USE_SUPPLIED_DISPLAY_CONFIG的修饰符,SDC_TOPOLOGY_SUPPLIED调用方知道虚拟模式的标志。 从 Windows 10 开始支持。
SDC_VIRTUAL_REFRESH_RATE_AWARE
0x00020000
SDC_USE_SUPPLIED_DISPLAY_CONFIG的修饰符,SDC_TOPOLOGY_SUPPLIED调用方知道虚拟刷新率的标志。 从 Windows 11 开始支持。
以下列表包含 Flags 参数的值的有效组合:
必须设置SDC_APPLY或SDC_VALIDATE,但不能同时设置两者。
必须设置SDC_USE_SUPPLIED_DISPLAY_CONFIG或SDC_TOPOLOGY_XXX的任意组合。 不能使用任何SDC_TOPOLOGY_XXX标志设置SDC_USE_SUPPLIED_DISPLAY_CONFIG。
只能使用 SDC_APPLY 设置SDC_NO_OPTIMIZATION。
允许使用任何其他有效组合SDC_ALLOW_CHANGES。
只能使用 SDC_USE_SUPPLIED_DISPLAY_CONFIG 设置SDC_SAVE_TO_DATABASE。
SDC_PATH_PERSIST_IF_REQUIRED不能与SDC_USE_SUPPLIED_DISPLAY_CONFIG或SDC_TOPOLOGY_SUPPLIED一起使用。
仅当指定了SDC_APPLY和SDC_USE_SUPPLIED_DISPLAY_CONFIG时,SDC_FORCE_MODE_ENUMERATION才有效。
仅当指定了SDC_TOPOLOGY_SUPPLIED时,才允许SDC_ALLOW_PATH_ORDER_CHANGES。
SDC_TOPOLOGY_SUPPLIED不能与任何其他SDC_TOPOLOGY_XXX标志一起使用。 由于验证问题,如果调用方违反此规则, SetDisplayConfig 不会失败。 但是, SetDisplayConfig 会忽略SDC_TOPOLOGY_SUPPLIED标志。
SDC_TOPOLOGY_XXX标志可以组合使用。 例如,如果设置了SDC_TOPOLOGY_CLONE和SDC_TOPOLOGY_EXTEND,则 API 将使用最新的克隆或扩展拓扑,每个拓扑最近都为当前连接的监视器设置了该拓扑。
返回值
该函数返回以下返回代码之一。
返回代码        说明
ERROR_SUCCESS
函数成功。
ERROR_INVALID_PARAMETER
指定的参数和标志的组合无效。
ERROR_NOT_SUPPORTED
系统未运行根据 Windows 显示驱动程序模型 (WDDM) 编写的图形驱动程序。 仅在运行 WDDM 驱动程序的系统上支持 函数。
ERROR_ACCESS_DENIED
调用方无权访问控制台会话。 如果调用进程无权访问当前桌面或在远程会话上运行,则会发生此错误。
ERROR_GEN_FAILURE
发生了未指定的错误。
ERROR_BAD_CONFIGURATION
函数找不到调用方未指定的源模式和目标模式的可行解决方案。
注解
SetDisplayConfig 函数采用具有任何指定源和目标模式信息的活动显示路径,并使用最佳模式逻辑生成任何缺失的源和目标模式信息。 然后,此函数设置完整的显示路径。
DISPLAYCONFIG_PATH_SOURCE_INFO和DISPLAYCONFIG_PATH_TARGET_INFO结构中的 ModeInfoIdx 成员用于指示是否为给定的活动路径提供源模式和目标模式。 如果为任一项DISPLAYCONFIG_PATH_MODE_IDX_INVALID索引值,则表示未指定模式信息。 它对于为给定路径指定的路径加源模式或路径加源和目标模式信息有效。 但是,在不使用源模式的情况下指定路径加目标模式是无效的。
每个源和目标标识符的源和目标模式只能在 modeInfoArray 数组中出现一次。 例如,源标识符 S1 的源模式只能在表中出现一次;如果多个路径引用同一个源,则必须使用相同的 ModeInfoIdx。
预期大多数调用方使用 QueryDisplayConfig 获取当前配置以及其他有效可能性,然后使用 SetDisplayConfig 测试和设置配置。
活动路径在 PathArray 数组中的显示顺序决定了路径优先级。
默认情况下, SetDisplayConfig 永远不会更改提供的任何路径、源模式或目标模式信息。 如果最佳模式逻辑在未更改指定的显示路径信息的情况下找不到解决方案, 则 SetDisplayConfig 将失败并ERROR_BAD_CONFIGURATION。 在这种情况下,调用方应指定SDC_ALLOW_CHANGES标志,以允许函数调整某些指定的源和模式详细信息,以允许显示路径更改成功。
如果指定的或计算的源和目标模式具有相同的尺寸, SetDisplayConfig 会自动将路径缩放设置为DISPLAYCONFIG_PPR_IDENTITY,然后再设置显示路径并将其保存在数据库中。 有关 SetDisplayConfig 如何处理缩放的信息,请参阅 缩放桌面映像。
当调用方指定SDC_USE_SUPPLIED_DISPLAY_CONFIG标志来设置克隆路径,并且路径数组中的任何源模式索引无效时, SetDisplayConfig 将确定该源中的所有源模式索引都无效。 SetDisplayConfig 使用最佳模式逻辑来确定源模式信息。
除了SDC_TOPOLOGY_SUPPLIED标志 (,有关SDC_TOPOLOGY_SUPPLIED的详细信息,请参阅以下段落) ,SDC_TOPOLOGY_XXX标志设置最后一个显示路径设置,包括该拓扑类型的源和目标模式信息。 有关有效SDC_TOPOLOGY_XXX标志组合的信息,请参阅 Flags 参数说明。 pathArray 和 modeInfoArray 参数必须为 NULL,并且其关联大小必须为零。 例如,如果设置了SDC_TOPOLOGY_CLONE和SDC_TOPOLOGY_EXTEND,则此函数使用最新的克隆或扩展显示路径配置。 如果请求单个拓扑类型,则使用该类型的最后一个配置。 如果以前从未设置过该拓扑, 则 SetDisplayConfig 使用最佳拓扑逻辑查找最佳拓扑,然后使用最佳模式逻辑查找要使用的最佳源和目标模式。 如果已设置拓扑标志的组合,并且其中没有数据库条目,则使用以下优先级。 对于笔记本电脑:克隆、扩展、内部和外部;对于桌面,优先级为先扩展,然后克隆。
调用方可以指定SDC_TOPOLOGY_SUPPLIED标志,以指示它仅设置 (拓扑) 和请求的路径信息, SetDisplayConfig 获取并使用持久性数据库中的源和目标模式信息。 如果调用方提供的活动路径在持久性数据库中没有条目, SetDisplayConfig 将失败。 在这种情况下,如果调用方再次使用相同的路径数据调用 SetDisplayConfig ,但设置了SDC_USE_SUPPLIED_DISPLAY_CONFIG标志, 则 SetDisplayConfig 将使用最佳模式逻辑来创建源和目标模式信息。 当调用方指定SDC_TOPOLOGY_SUPPLIED时,调用方必须将 numModeInfoArrayElements 参数设置为零, 将 modeInfoArray 参数设置为 NULL;但是,调用方必须为调用方所需的路径信息设置 pathArray 和 numPathArrayElements 参数。 调用方必须将此路径数据中的所有源和目标模式索引标记为无效 (DISPLAYCONFIG_PATH_MODE_IDX_INVALID) 。
下表提供了一些常见方案,其中 调用 SetDisplayConfig 以及调用方传递给 Flags 参数以实现这些方案的标志组合。
方案        标志组合
测试计算机上是否支持指定的显示配置        SDC_VALIDATE |SDC_USE_SUPPLIED_DISPLAY_CONFIG
设置指定的显示配置并保存到数据库        SDC_APPLY |SDC_USE_SUPPLIED_DISPLAY_CONFIG |SDC_SAVE_TO_DATABASE
设置临时显示配置 (即不会保存显示配置)        SDC_APPLY |SDC_USE_SUPPLIED_DISPLAY_CONFIG
测试计算机上是否支持克隆        SDC_VALIDATE |SDC_TOPOLOGY_CLONE
设置克隆拓扑        SDC_APPLY |SDC_TOPOLOGY_CLONE
设置克隆拓扑并允许启用路径持久性(如果需要满足请求)        SDC_APPLY |SDC_TOPOLOGY_CLONE |SDC_PATH_PERSIST_IF_REQUIRED
从临时模式返回到上次保存的显示配置        SDC_APPLY|SDC_USE_DATABASE_CURRENT
仅给定路径信息,使用数据库中的路径的源和目标信息设置显示配置,并忽略路径顺序        SDC_APPLY |SDC_TOPOLOGY_SUPPLIED |SDC_ALLOW_PATH_ORDER_CHANGES
DPI 虚拟化
此 API 不参与 DPI 虚拟化。 DEVMODE 结构中的所有大小都以物理像素为单位,与调用上下文无关。
要求          
最低受支持的客户端        在 Windows 7 及更高版本的 Windows 操作系统中可用。
目标平台        通用
标头        winuser.h (包括 Windows.h)
Library        User32.lib
DLL        User32.dll
API 集        ext-ms-win-ntuser-sysparams-ext-l1-1-1 (在 Windows 10 版本 10.0.14393 中引入)


最佳答案

查看完整内容

这不是一个DLL函数吗..你直接调用就好 在DLL里添加这个函数,参数5个整数,dll名称user32.dll,函数名:SetDisplayConfig 调用方法 SetDisplayConfig(0, 0, 0, 0, 位或(显示类型,SetDisplayConfigFlags.SDC_APPLY)) 补充内容 (2024-3-9 14:41): 常量你自己转一下整数就行了

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:0% (0/2)

签到天数: 16 天

发表于 2024-3-9 11:31:30 | 显示全部楼层   浙江省温州市
  这不是一个DLL函数吗..你直接调用就好


在DLL里添加这个函数,参数5个整数,dll名称user32.dll,函数名:SetDisplayConfig
调用方法
SetDisplayConfig(0, 0, 0, 0, 位或(显示类型,SetDisplayConfigFlags.SDC_APPLY))

补充内容 (2024-3-9 14:41):
常量你自己转一下整数就行了
回复

使用道具 举报

结帖率:100% (1/1)

签到天数: 17 天

发表于 2024-3-9 13:34:46 | 显示全部楼层   广东省佛山市
你的精币比人民币还高值
回复

使用道具 举报

结帖率:50% (3/6)

签到天数: 19 天

 楼主| 发表于 2024-3-9 14:05:41 | 显示全部楼层   广东省佛山市
苦战两个小时,已经自行解决。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表