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;
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM