有个实际的需求,就是软件在运行期间只能使用单显示器,不允许多显示器运行,所以需要对显示器的个数进行检测。
一般而言,显示器数量的检测可以等同于显示屏幕的检测,在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; }