如何将重复的监视器检测为单独的屏幕
使用这个问题的答案,我可以得到“屏幕”计数。 但是,这似乎不适用于设置为“重复”的监视器(报告一个监视器而不是2个监视器)。 我的应用程序提示用户从VGA切换到HDMI(这是在具有两个输出端口的设备上),然后输入“你能看到这个吗?” 在屏幕上提示以validation两个video端口是否正常工作。
我试图在显示提示之前检测到开关已经发生,但是由于上面提到的问题,代码没有看到监视器计数递减,然后递增(这就是我检测开关的方式)。
如果所有内容都设置为重复,我如何检测video设备开关? 如果监视器设置为“extend”,则现有代码有效。 还有一个内部video设备也始终存在(不试图测试这个)。
请参阅此问题并使用QueryDisplayConfig中提供的(并在答案中修复)包装器。
更改导入的签名以将out DisplayConfigTopologyId topology
作为最后一个参数。
使用QueryDisplayFlags.DatabaseCurrent
作为显示标志,否则您将获得状态87(无效参数)
在调用QueryDisplayFlags之后,拓扑将是Clone
, Extend
等。
打电话给方法……
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; }