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

浙公网安备 33010602011771号