有個實際的需求,就是軟件在運行期間只能使用單顯示器,不允許多顯示器運行,所以需要對顯示器的個數進行檢測。
一般而言,顯示器數量的檢測可以等同於顯示屏幕的檢測,在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; }