QT:显示器数量检测

时间:2024-02-18 13:30:17

有个实际的需求,就是软件在运行期间只能使用单显示器,不允许多显示器运行,所以需要对显示器的个数进行检测。

一般而言,显示器数量的检测可以等同于显示屏幕的检测,在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;
}