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