思路:

  1. 通过EnumDisplayMonitors枚举所有的显示器
  2. 通过GetMonitorInfo获取设备分辨率
  3. 通过EnumDisplaySettings获取设备刷新频率
  4. 通过EnumDisplayDevices获取edid数据在注册表中的位置
  5. 解析edid获取设备尺寸,厂商,名称等信息
  6. 通过CreateDC获取指定屏幕的HDC

edit参考:EDID标准简介,EDID的简介和解析

下面是实现代码:

typedef struct stMonitorInfo
{TCHAR szfirm[4];//厂商TCHAR szname[18];//显示器名称unsigned long resolution_width, resolution_heght;//分辨率unsigned long device_width_cm, device_heght_cm;//设备尺寸unsigned long frequency;//设备刷新频率stMonitorInfo(){memset(this, 0, sizeof(stMonitorInfo));}
}stMonitorInfo;

枚举设备并且获取设备信息

 BOOL CALLBACK _MonitorEnumProc(HMONITOR hMonitor,  // handle to display monitorHDC hdcMonitor,     // handle to monitor DCLPRECT lprcMonitor, // monitor intersection rectangleLPARAM dwData       // data){std::vector<stMonitorInfo> *pvec_monitor = (std::vector<stMonitorInfo>*) dwData;MONITORINFOEX miex;miex.cbSize = sizeof(miex);if (GetMonitorInfo(hMonitor, &miex)){stMonitorInfo monitor_info;monitor_info.resolution_width = miex.rcMonitor.right - miex.rcMonitor.left;monitor_info.resolution_heght = miex.rcMonitor.bottom - miex.rcMonitor.top;//monitor_info.device_millimeters_width = GetDeviceCaps(hdcMonitor, HORZSIZE);//monitor_info.device_millimeters_heght = GetDeviceCaps(hdcMonitor, VERTSIZE);DEVMODE devMode = { 0 };devMode.dmSize = sizeof(devMode);devMode.dmDriverExtra = sizeof(0);if (EnumDisplaySettings(miex.szDevice, ENUM_CURRENT_SETTINGS, &devMode)){if (devMode.dmFields & DM_DISPLAYFREQUENCY){monitor_info.frequency = devMode.dmDisplayFrequency;}}//为了防止edid不对,采取HDC方式获取HDC hdc = CreateDC(NULL, miex.szDevice, NULL, NULL);if (hdc){get_display_physical_size(hdc, monitor_info.device_width_cm, monitor_info.device_heght_cm);DeleteDC(hdc);}DISPLAY_DEVICE data = { 0 };data.cb = sizeof(data);if (EnumDisplayDevices(miex.szDevice, 0, &data, EDD_GET_DEVICE_INTERFACE_NAME)){//DeviceID "\\\\?\\DISPLAY#DELA07A#5&30f41049&0&UID4352#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}" char[128]//开始解析printf("Monitor DeviceID:%s\r\n", data.DeviceID);std::vector<std::string> vec_data;split(data.DeviceID, "#", vec_data);if (vec_data.size() >= 3){char szKey[1024] = "";_stprintf_s(szKey, 1024, "SYSTEM\\CurrentControlSet\\Enum\\DISPLAY\\%s\\%s\\Device Parameters", vec_data[1].c_str(), vec_data[2].c_str());std::vector<BYTE> edid;if (Registry::Read(HKEY_LOCAL_MACHINE, szKey, "EDID", edid)){//这里应该计算校验和如果校验和不对则忽略if (monitor_info.device_width_cm == 0 && monitor_info.device_heght_cm == 0){monitor_info.device_width_cm = edid[0x15];monitor_info.device_heght_cm = edid[0x16];}//给一个默认名称,方式edid数据里面没有名称lstrcpyn(monitor_info.szname, vec_data[1].c_str(), 260);//避免大小端问题std::bitset<8> bits0(edid[8]);std::bitset<8> bits1(edid[9]);std::string strBits = bits0.to_string() + bits1.to_string();std::bitset<5> prd0(strBits, 1);std::bitset<5> prd1(strBits, 6);std::bitset<5> prd2(strBits, 11);ULONG lval0 = prd0.to_ulong();ULONG lval1 = prd1.to_ulong();ULONG lval2 = prd2.to_ulong();monitor_info.szfirm[0] = TCHAR('A') + lval0 - 1;monitor_info.szfirm[1] = TCHAR('A') + lval1 - 1;monitor_info.szfirm[2] = TCHAR('A') + lval2 - 1;//获取显示器名称std::vector<int> vec = { 0x36, 0x48, 0x5a, 0x6c };for (int i = 0; i < vec.size(); ++i){int nindex = vec[i];if (edid[nindex] == 0x00 && edid[nindex + 1] == 0x00 && edid[nindex + 2] == 0x00 && edid[nindex +3] == 0xfc){std::string str((char *)&edid[nindex + 4], 14);//删除\0 \n 0x20if (str[0] == 0) str = str.substr(1);while (!str.empty()){if (str[str.size() - 1] == 0x20 || str[str.size() - 1] == '\n'){str = str.substr(0, str.size() - 1);continue;}break;                                       }lstrcpy(monitor_info.szname, str.c_str());}}}}}pvec_monitor->push_back(monitor_info);}return TRUE;}void get_monitor_info(std::vector<stMonitorInfo> &vec_monitor){EnumDisplayMonitors(NULL, NULL, _MonitorEnumProc, (LPARAM)&vec_monitor);}void get_display_resolution(int &width, int &height){static int Width{ GetSystemMetrics(SM_CXSCREEN) };static int Heigth{ GetSystemMetrics(SM_CYSCREEN) };width = Width;height = Heigth;}void get_display_physical_size(HDC hdc,unsigned int &width_millimeters, unsigned int &height_millimeters){bool bRelease = false;if (hdc == NULL){bRelease = true;hdc = GetDC(NULL);}width_millimeters = GetDeviceCaps(hdc, HORZSIZE)/10;height_millimeters = GetDeviceCaps(hdc, VERTSIZE)/10;if (bRelease)ReleaseDC(NULL, hdc);}

C++ 获取多显示器设备信息相关推荐

  1. 获取Android 手机设备信息:包括机型、操作系统版本号、手机分辨率、运营商、当前联网方式、IMEI、MEID、MAC地址

    获取Android 手机设备信息:操作系统版本号.手机分辨率.运营商.当前联网方式.IMEI.MEID.MAC地址 包括双卡机型上的两个IMEI信息 /*** Created by Administr ...

  2. protal服务器获取不到设备信息,Poral网页认证提示portal服务器获取不到设备信息或者设备没有回应req_info报文的解决办法...

    portal网页认证时提示获取不到设备信息或者没有回应req_info报文 文档名称 文档密级 问题描述: Portal网页认证场景,用户在浏览器输入账号名.密码点击登录时,系统提示portal se ...

  3. Flutter获取Android/iOS设备信息

    我们在进行各个系统的原生开发时,都有对应的方法获取设备信息,那么在使用Flutter时如何获取设备相关的相关信息呢? 我们本文就来介绍一个Flutter插件: Flutter Device Info ...

  4. 获取手机的设备信息和唯一ID

    1.获取手机基本信息 参考:https://blog.csdn.net/wjky2014/article/details/109733589 一.获取手机基本信息(厂商.型号等参数) 二.设备信息获取 ...

  5. ua获取手机型号_js获取移动端设备信息(IMEM,IMIS,手机型号,系统版本,浏览器信息等)...

    方法一: HTML+  封装好的方法,额外配置,使用指定方法打包才可用 属性: imei: 设备的国际移动设备身份码 imsi: 设备的国际移动用户识别码 model: 设备的型号 vendor: 设 ...

  6. 如何获取Windows硬件设备信息(wmic命令介绍)

    WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了从命令行接口和批处理脚本执行系统管理的支持.以下是wmic常用命令介绍: 获 ...

  7. android编程设备信息,Android获取当前手机设备信息工具类详解

    工作中用到的图片处理工具类,简单写下来,以便备用! public class BitmapUtils { /** * 图像背景圆角处理 * bitmap要处理的图片 roundPx 图片弯角的圆度一般 ...

  8. android手机获取手机设备信息

    在有的项目中需要根据特定的手机信息来进行处理,这时就需要我们来获取手机的设备信息了,那首先看看我的测试机的一些基本信息: 那么这些信息怎么获得呢??其实都封装在了TelephonyManager中,我 ...

  9. Android 手机设备信息获取使用详解

    Android 手机是我们常用的工具之一,买手机之前,手机厂商会提供一些手机参数给我们,那么问题来了,我们该如何获取手机上的参数信息呢? 通过本文你讲了解到获取手机常用信息的基本方法. 获取手机基本信 ...

最新文章

  1. nginx大量TIME_WAIT的解决办法(转载)
  2. linux常用高级命令,Linux常用高级文件操作命令
  3. ZT 类模板Stack的实现 by vector
  4. MYSQL错误: ERROR 1205: Lock wait timeout exceeded(处理MYSQL锁等待)解决办法
  5. php7改进,关注一下:PHP 7.3.7 正式发布 改进、修复的地方不少哦
  6. 查看mysql的安装信息
  7. 吴恩达深度学习之一《神经网络和深度学习》学习笔记
  8. C\C++的转义字符
  9. C# asp.net常见编译|运行错误
  10. 怎样在虚拟机装文件服务器,虚拟机下怎么解压文件
  11. rust 案例_深入浅出rust.pdf 高清版
  12. 用JAVA实现简单点餐系统
  13. p50 p51 p52 p53
  14. 替代MP9486A 输入120V降压恒压IC方案 GPS防盗器IC方案
  15. (精简理解)DPDK的无锁环形队列Ring
  16. Flutte 之TextFile(文本输入框)
  17. Python 音频随机播放器脚本
  18. 分享一个麻将听牌算法(带癞子)(Lua)
  19. 无源定位入门(三)AOA(2)测角代码(MUSIC和ROOT—MUSIC)
  20. 智慧城市专家指导东区项目

热门文章

  1. 魔众一物一码溯源防伪系统 v1.4.0 模块市场升级,组件优化
  2. easybcd不认linux分区,kali linux双系统引导問題,easybcd不会设置。
  3. 2022-2028全球与中国颈带式耳机市场现状及未来发展趋势
  4. Samsung ADV:Samsung Tire(AC)
  5. 头部互联网公司都爱在哪扎堆?
  6. 《计算复杂性:现代方法》——导读
  7. SYN5631型频率响应分析仪(扫频仪)
  8. Labelme的windows的可执行文件
  9. [历史档案]晨雨校园
  10. 基于Hadoop技术实现的离线电商分析平台(Flume、Hadoop、Hbase、SpringMVC、highcharts)- 驴妈妈旅游项目