C++ 获取多显示器设备信息
思路:
- 通过
EnumDisplayMonitors
枚举所有的显示器 - 通过
GetMonitorInfo
获取设备分辨率 - 通过
EnumDisplaySettings
获取设备刷新频率 - 通过
EnumDisplayDevices
获取edid
数据在注册表中的位置 - 解析
edid
获取设备尺寸,厂商,名称等信息 - 通过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++ 获取多显示器设备信息相关推荐
- 获取Android 手机设备信息:包括机型、操作系统版本号、手机分辨率、运营商、当前联网方式、IMEI、MEID、MAC地址
获取Android 手机设备信息:操作系统版本号.手机分辨率.运营商.当前联网方式.IMEI.MEID.MAC地址 包括双卡机型上的两个IMEI信息 /*** Created by Administr ...
- protal服务器获取不到设备信息,Poral网页认证提示portal服务器获取不到设备信息或者设备没有回应req_info报文的解决办法...
portal网页认证时提示获取不到设备信息或者没有回应req_info报文 文档名称 文档密级 问题描述: Portal网页认证场景,用户在浏览器输入账号名.密码点击登录时,系统提示portal se ...
- Flutter获取Android/iOS设备信息
我们在进行各个系统的原生开发时,都有对应的方法获取设备信息,那么在使用Flutter时如何获取设备相关的相关信息呢? 我们本文就来介绍一个Flutter插件: Flutter Device Info ...
- 获取手机的设备信息和唯一ID
1.获取手机基本信息 参考:https://blog.csdn.net/wjky2014/article/details/109733589 一.获取手机基本信息(厂商.型号等参数) 二.设备信息获取 ...
- ua获取手机型号_js获取移动端设备信息(IMEM,IMIS,手机型号,系统版本,浏览器信息等)...
方法一: HTML+ 封装好的方法,额外配置,使用指定方法打包才可用 属性: imei: 设备的国际移动设备身份码 imsi: 设备的国际移动用户识别码 model: 设备的型号 vendor: 设 ...
- 如何获取Windows硬件设备信息(wmic命令介绍)
WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了从命令行接口和批处理脚本执行系统管理的支持.以下是wmic常用命令介绍: 获 ...
- android编程设备信息,Android获取当前手机设备信息工具类详解
工作中用到的图片处理工具类,简单写下来,以便备用! public class BitmapUtils { /** * 图像背景圆角处理 * bitmap要处理的图片 roundPx 图片弯角的圆度一般 ...
- android手机获取手机设备信息
在有的项目中需要根据特定的手机信息来进行处理,这时就需要我们来获取手机的设备信息了,那首先看看我的测试机的一些基本信息: 那么这些信息怎么获得呢??其实都封装在了TelephonyManager中,我 ...
- Android 手机设备信息获取使用详解
Android 手机是我们常用的工具之一,买手机之前,手机厂商会提供一些手机参数给我们,那么问题来了,我们该如何获取手机上的参数信息呢? 通过本文你讲了解到获取手机常用信息的基本方法. 获取手机基本信 ...
最新文章
- nginx大量TIME_WAIT的解决办法(转载)
- linux常用高级命令,Linux常用高级文件操作命令
- ZT 类模板Stack的实现 by vector
- MYSQL错误: ERROR 1205: Lock wait timeout exceeded(处理MYSQL锁等待)解决办法
- php7改进,关注一下:PHP 7.3.7 正式发布 改进、修复的地方不少哦
- 查看mysql的安装信息
- 吴恩达深度学习之一《神经网络和深度学习》学习笔记
- C\C++的转义字符
- C# asp.net常见编译|运行错误
- 怎样在虚拟机装文件服务器,虚拟机下怎么解压文件
- rust 案例_深入浅出rust.pdf 高清版
- 用JAVA实现简单点餐系统
- p50 p51 p52 p53
- 替代MP9486A 输入120V降压恒压IC方案 GPS防盗器IC方案
- (精简理解)DPDK的无锁环形队列Ring
- Flutte 之TextFile(文本输入框)
- Python 音频随机播放器脚本
- 分享一个麻将听牌算法(带癞子)(Lua)
- 无源定位入门(三)AOA(2)测角代码(MUSIC和ROOT—MUSIC)
- 智慧城市专家指导东区项目
热门文章
- 魔众一物一码溯源防伪系统 v1.4.0 模块市场升级,组件优化
- easybcd不认linux分区,kali linux双系统引导問題,easybcd不会设置。
- 2022-2028全球与中国颈带式耳机市场现状及未来发展趋势
- Samsung ADV:Samsung Tire(AC)
- 头部互联网公司都爱在哪扎堆?
- 《计算复杂性:现代方法》——导读
- SYN5631型频率响应分析仪(扫频仪)
- Labelme的windows的可执行文件
- [历史档案]晨雨校园
- 基于Hadoop技术实现的离线电商分析平台(Flume、Hadoop、Hbase、SpringMVC、highcharts)- 驴妈妈旅游项目