【问题标题】:Programmatically changing the "presentation display mode"以编程方式更改“演示文稿显示模式”
【发布时间】:2013-05-28 10:56:04
【问题描述】:

演示显示模式是您在使用 Windows+p 快捷方式时看到的那些:

  1. 仅限电脑
  2. 复制
  3. 扩展
  4. 仅限投影仪

是否存在任何允许在这些显示模式之间切换的 API 调用?

我想以编程方式在显示器和 HDMI 电视之间切换(并同时做很多其他事情,因此 Windows+p 没有用),但我撞砖墙。

【问题讨论】:

    标签: c# winapi multiple-monitors


    【解决方案1】:

    如果 EnumDisplaySettingsEx 和 ChangeDisplaySettingsEx 函数不适合你,你也可以使用这个:

            private void SetDisplayMode(DisplayMode mode)
            {
                var proc = new Process();
                proc.StartInfo.FileName = "DisplaySwitch.exe";
                switch (mode)
                {
                    case DisplayMode.External:
                        proc.StartInfo.Arguments = "/external";
                        break;
                    case DisplayMode.Internal:
                        proc.StartInfo.Arguments = "/internal";
                        break;
                    case DisplayMode.Extend:
                        proc.StartInfo.Arguments = "/extend";
                        break;
                    case DisplayMode.Duplicate:
                        proc.StartInfo.Arguments = "/clone";
                        break;
                }
                proc.Start();
            }
            enum DisplayMode
            {
                Internal,
                External,
                Extend,
                Duplicate
            }
    

    这将根据所需的配置使用不同的参数调用 DisplaySwitcher。因此,您可以调用:

       SetDisplayMode(DisplayMode.Extend);
    

    【讨论】:

    • 你先生,太棒了。非常感谢您提供此解决方案。我不知道 DisplaySwitch.exe 甚至存在。
    • 是的,这是我正在寻找的,有什么方法可以不使用 displayswitch.exe,因为我想默默地做。在 Windows 中,它会将项目打开到已连接的屏幕,然后切换..
    • 使用 Win32 API 函数而不是调用另一个程序不是更好(并且得到更多支持)吗?如果该程序在 Windows 的未来版本中消失,或者更改它的命令行语法怎么办。
    【解决方案2】:

    您可以使用EnumDisplaySettingsExChangeDisplaySettingsEx获取和更改显示设置:

    ChangeDisplaySettingsEx 函数更改 指定显示设备到指定图形模式。

    检查此Codeproject project 和此Stackoverflow question 示例代码

    【讨论】:

    • 不幸的是它不起作用。我在 Stackoverflow 上试过示例代码,昨天直接导入 Codeproject 项目并编译。即使已识别出正确的显示器,它也不会启用第二台显示器(HDMI 电视)。我可以通过这些 API 调用更改分辨率并执行各种其他与显示相关的事情,但禁用主监视器并启用辅助监视器(反之亦然)根本不可能。令人失望的是,Windows 7 实现了这些非常具体的“演示模式”,却没有通过 API 提供对它们的直接访问
    【解决方案3】:

    您可以使用SetDisplayConfig()设置桌面显示模式 例如。

    SetDisplayConfig(0, NULL, 0, NULL, SDC_TOPOLOGY_EXTERNAL | SDC_APPLY);
    

    您可以使用QueryDisplayConfig() 检索当前显示模式。 例如。

    DISPLAYCONFIG_TOPOLOGY_ID currentTopology;
    QueryDisplayConfig(QDC_DATABASE_CURRENT, &PathArraySize, PathArray, &ModeArraySize, ModeArray, &currentTopology);
    

    (此电话的相关来源here

    这是针对 C++ 的。 C# 需要 DLL 导入。

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 2011-04-02
      • 1970-01-01
      • 2020-06-11
      • 2011-03-15
      相关资源
      最近更新 更多