【问题标题】:How to detect duplicated monitors as separate screens如何将重复的监视器检测为单独的屏幕
【发布时间】:2014-04-11 02:53:48
【问题描述】:

使用this 问题中的答案,我可以获得“屏幕”计数。但是,这似乎不适用于设置为“重复”的监视器(报告的是一个监视器而不是 2 个)。我的应用程序提示用户从 VGA 切换到 HDMI(这是在具有两个输出端口的设备上),然后输入“你能看到这个吗?”屏幕上的提示以验证两个视频端口是否正常工作。

我试图在显示提示之前检测到切换已经发生,但由于上述问题,代码没有看到监视器计数递减,然后递增(这就是我检测切换的方式)。

如果所有内容都设置为重复,我如何检测视频设备开关?如果监视器设置为“扩展”,则现有代码有效。还有一个始终存在的内部视频设备(不是试图测试这个)。

【问题讨论】:

    标签: c# multiple-monitors


    【解决方案1】:

    请参阅This question 并使用为 QueryDisplayConfig 提供的(并在答案中修复)包装器。

    将导入的签名更改为将out DisplayConfigTopologyId topology 作为最后一个参数。

    使用QueryDisplayFlags.DatabaseCurrent作为显示标志,否则你会得到状态87(无效参数)

    调用 QueryDisplayFlags 后,拓扑将为 CloneExtend 等。

    调用方法...

    var status = CCDWrapper.QueryDisplayConfig(
        CCDWrapper.QueryDisplayFlags.DatabaseCurrent,
        ref numPathArrayElements, pathInfoArray, ref numModeInfoArrayElements,
        modeInfoArray, out currentTopologyId);
    

    在我的测试中,numPathArrayElements 总是以当前使用中的监视器数量返回。如果我将其更改为“仅显示屏幕 1”,则表示 1 个屏幕,内部拓扑。 “仅显示屏幕 2”返回 1 个外部屏幕。 “克隆”显示 2 个屏幕。

    【讨论】:

    • 感谢您的回答,但这只会告诉我是否存在重复项,对吗?有没有办法知道当前连接了 多少
    • @BradleyDotNET 在我的测试中,numPathArrayElements 总是返回当前In Use 的监视器数量。如果将其更改为仅显示屏幕 1,则表示 1 个屏幕,内部拓扑。仅显示屏幕 2 与外部 1 个屏幕一起返回。克隆显示 2 个屏幕。
    • 太棒了!我还不能设置我的测试环境,所以我很感激这些信息。再次感谢。
    【解决方案2】:

    James Barrass 的回答对我不起作用。我最终在这里得到了答案:link

    代码如下:

    public static int GetScreenCount()
    {
        ManagementObjectSearcher searcher =
            new ManagementObjectSearcher("root\\CIMV2",
            "SELECT * FROM Win32_PnPEntity where service =\"monitor\"");
    
        return searcher.Get().Count;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-02
      • 2014-02-25
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2011-06-03
      相关资源
      最近更新 更多