zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    NSURLSession学习笔记(一)简介
    Objective-C的属性和成员变量用法及关系浅析
    Object-C 中的Selector 概念
    IOS SEL (@selector) 原理及使用总结(一)
    iOS应用截屏
    iOS运行时工具-cycript
    iOS设备是否越狱的判断代码
    iphone——日期处理
    在iOS中使用ZBar扫描二维码
    使用Dockerfile docker tomcat部署
  • 原文地址:https://www.cnblogs.com/chyshx/p/14335402.html
Copyright © 2011-2022 走看看