如何将重复的监视器检测为单独的屏幕

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

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

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

请参阅此问题并使用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总是以当前正在使用的监视器数量的forms返回。 如果我将其更改为“仅显示屏幕1”,则表示1个屏幕,拓扑内部。 “仅显示屏幕2”在外部显示1个屏幕。 “克隆”显示2个屏幕。

James Barrass的回答对我不起作用。 我最终得到了答案: 链接

这是代码:

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