有个实际的需求, 就是软件在运行期间只能使用单显示器, 不允许多显示器运行, 所以需要对显示器的个数进行检测.
一般而言, 显示器数量的检测可以等同于显示屏幕的检测, 在 QT 中, 我们可以通过获取 screen 的数量是否等于 1 来判断是否有外接的显示器设备
但是, 有这么 2 种情况需要考虑:
1. 软件被远程登陆控制 (针对 Windows 的远程桌面)
2. 显示器使用了克隆模式 (即两个屏幕显示的内容一致)
通过研究和测试:
针对 1 的情况, 我们获取到的 screen 的 count 等于 0, 在 Windows 平台上我们可以通过外加判断远程登录是否使用来进一步排查.
针对 2 的情况, 比较复杂一些, Windows 和 Mac 的处理方式不太一样
在 Windows 上, 可以通过一下方法获取, 核心是使用 QueryDisplayConfig 方法, 可以参考 MSDN:https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-querydisplayconfig.
- int GetDisplayMonitorNum()
- {
- UINT32 PathArraySize = 0;
- UINT32 ModeArraySize = 0;
- DISPLAYCONFIG_PATH_INFO* PathArray;
- DISPLAYCONFIG_MODE_INFO* ModeArray;
- DISPLAYCONFIG_TOPOLOGY_ID CurrentTopology;
- GetDisplayConfigBufferSizes(QDC_ALL_PATHS, &PathArraySize, &ModeArraySize);
- PathArray = (DISPLAYCONFIG_PATH_INFO*)malloc(PathArraySize * sizeof(DISPLAYCONFIG_PATH_INFO));
- memset(PathArray, 0, PathArraySize * sizeof(DISPLAYCONFIG_PATH_INFO));
- ModeArray = (DISPLAYCONFIG_MODE_INFO*)malloc(ModeArraySize * sizeof(DISPLAYCONFIG_MODE_INFO));
- memset(ModeArray, 0, ModeArraySize * sizeof(DISPLAYCONFIG_MODE_INFO));
- LONG ret = QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &PathArraySize, PathArray, &ModeArraySize, ModeArray, NULL);
- if (ret == ERROR_SUCCESS)
- {
- return (int)PathArraySize;
- }
- else
- {
- return -1;
- }
- }
在 Mac 上可以使用如下方法: 核心在于 CGGetActiveDisplayList 方法和 CGDisplayIsInHWMirrorSet 方法, 后一个方法可以判断是否存在镜像
- //get monitor nums
- int util_mac::getDisplayMonitorNums()
- {
- CGDisplayCount numDisplays;
- CGDisplayErr err;
- err=CGGetActiveDisplayList(0, 0, &numDisplays);
- if(err!=CGDisplayNoErr)
- {
- qDebug()<<"get list of displays error";
- return 0;
- }
- // 如果超过 1 个, 则直接返回
- if(numDisplays>1)
- return numDisplays;
- // 如果是 1 个情况下, 检查一下是否存在镜像
- bool isMirror=CGDisplayIsInHWMirrorSet(CGMainDisplayID())!=0;
- if(isMirror)
- return 2;
- return 1;
- }
来源: http://www.bubuko.com/infodetail-3720864.html