如何获得显示器正确的物理尺寸?

2024-01-06

如何获得显示器的尺寸(以厘米或英寸为单位)?

此代码并不总是正确工作:

HDC hdc = CreateDC(_T("DISPLAY"),dd.DeviceName,NULL,NULL);
int width = GetDeviceCaps(hdc, HORZSIZE);
int height = GetDeviceCaps(hdc, VERTSIZE);
ReleaseDC(0, hdc)

特别是对于多显示器配置。

Update:我需要获取普通显示器的尺寸,它们具有恒定的物理尺寸。


我找到了另一种方法。显示器的物理大小存储在 EDID 中,Windows 几乎总是注册表中其值的副本。如果您可以解析 EDID,则可以读取显示器的宽度和高度(以厘米为单位)。

Update:添加了代码

BOOL GetMonitorDevice( TCHAR* adapterName, DISPLAY_DEVICE &ddMon )
{
    DWORD devMon = 0;

    while (EnumDisplayDevices(adapterName, devMon, &ddMon, 0))
    {
        if (ddMon.StateFlags & DISPLAY_DEVICE_ACTIVE &&
            ddMon.StateFlags & DISPLAY_DEVICE_ATTACHED) // for ATI, Windows XP
            break;

        devMon++;
    }

    if (ddMon.DeviceString[0] == '\0')
    {
        EnumDisplayDevices(adapterName, 0, &ddMon, 0);
        if (ddMon.DeviceString[0] == '\0')
            _tcscpy_s(ddMon.DeviceString, _T("Default Monitor"));
    }
    return ddMon.DeviceID[0] != '\0';
}

BOOL GetMonitorSizeFromEDID(TCHAR* adapterName, DWORD& Width, DWORD& Height)
{
    DISPLAY_DEVICE ddMon;
    ZeroMemory(&ddMon, sizeof(ddMon));
    ddMon.cb = sizeof(ddMon);

    //read edid
    bool result = false;
    Width = 0;
    Height = 0;
    if (GetMonitorDevice(adapterName, ddMon))
    {
        TCHAR model[8];
        TCHAR* s = _tcschr(ddMon.DeviceID, '\\') + 1;
        size_t len = _tcschr(s, '\\') - s;
        if (len >= _countof(model))
            len = _countof(model) - 1;
        _tcsncpy_s(model, s, len);

        TCHAR *path = _tcschr(ddMon.DeviceID, '\\') + 1;
        TCHAR str[MAX_PATH] = _T("SYSTEM\\CurrentControlSet\\Enum\\DISPLAY\\");
        _tcsncat_s(str, path, _tcschr(path, '\\')-path);
        path = _tcschr(path, '\\') + 1;
        HKEY hKey;
        if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, str, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
        {
            DWORD i = 0;
            DWORD size = MAX_PATH;
            FILETIME ft;
            while(RegEnumKeyEx(hKey, i, str, &size, NULL, NULL, NULL, &ft) == ERROR_SUCCESS)
            {
                HKEY hKey2;
                if(RegOpenKeyEx(hKey, str, 0, KEY_READ, &hKey2) == ERROR_SUCCESS)
                {
                    size = MAX_PATH;
                    if(RegQueryValueEx(hKey2, _T("Driver"), NULL, NULL, (LPBYTE)&str, &size) == ERROR_SUCCESS)
                    {
                        if (_tcscmp(str, path) == 0)
                        {
                            HKEY hKey3;
                            if(RegOpenKeyEx(hKey2, _T("Device Parameters"), 0, KEY_READ, &hKey3) == ERROR_SUCCESS)
                            {
                                BYTE EDID[256];
                                size = 256;
                                if(RegQueryValueEx(hKey3, _T("EDID"), NULL, NULL, (LPBYTE)&EDID, &size) == ERROR_SUCCESS)
                                {
                                    DWORD p = 8;
                                    TCHAR model2[9];

                                    char byte1 = EDID[p];
                                    char byte2 = EDID[p+1];
                                    model2[0]=((byte1 & 0x7C) >> 2) + 64;
                                    model2[1]=((byte1 & 3) << 3) + ((byte2 & 0xE0) >> 5) + 64;
                                    model2[2]=(byte2 & 0x1F) + 64;
                                    _stprintf(model2 + 3, _T("%X%X%X%X"), (EDID[p+3] & 0xf0) >> 4, EDID[p+3] & 0xf, (EDID[p+2] & 0xf0) >> 4, EDID[p+2] & 0x0f);
                                    if (_tcscmp(model, model2) == 0)
                                    {
                                        Width = EDID[22];
                                        Height = EDID[21];
                                        result = true;
                                    }
                                    else
                                    {
                                        // EDID incorrect
                                    }
                                }
                                RegCloseKey(hKey3);
                            }
                        }
                    }
                    RegCloseKey(hKey2);
                }
                i++;
            }
            RegCloseKey(hKey);
        }
    }

    return result;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获得显示器正确的物理尺寸? 的相关文章

  • 快速 log2(float x) 实现 C++

    我需要在 C 中非常快速地实现 log2 float x 函数 我发现了一个非常有趣的实现 而且速度非常快 include
  • Xamarin 测试记录器选项有错误。无法记录自动化测试

    选项 gt Xamarin gt Xamarin Test Recorder 中的所有设置都有错误 我的桌面上安装了 Visual Studio 2015 企业版 以及 Xamarin 和 Xamarin Test Recorder 插件
  • 基于多线程的 RabbitMQ 消费者

    我们有一个 Windows 服务 它监听单个 RabbitMQ 队列并处理消息 我们希望扩展相同的 Windows 服务 以便它可以监听 RabbitMQ 的多个队列并处理消息 不确定使用多线程是否可以实现这一点 因为每个线程都必须侦听 阻
  • ptrace和waitpid有什么关系?

    我正在练习使用ptrace但我不太了解它和之间的关系waitpid 这是我的测试程序 int main int argc char argv pid t pid 22092 if ptrace PTRACE ATTACH pid NULL
  • 如何准备sql语句并绑定参数?

    不幸的是 文档 http www sqlite org完全缺乏示例 这真的很奇怪 就好像它假设所有读者都是优秀的程序员一样 然而 我对C 并且无法真正从文档中弄清楚如何真正准备和执行语句 我喜欢它的实施方式PDO for PHP 通常 我只
  • C++ 中可以使用匿名类作为返回类型吗?

    有没有办法在 C 中使用匿名类作为返回类型 我用谷歌搜索这可能有效 struct Test fun 但是这段代码无法编译 错误信息是 新类型不能在返回类型中定义 其实代码没有任何意义 我只是想弄清楚匿名类是否可以用作C 中的返回类型 这是我
  • 在 T4 代码生成中,如何从引用的程序集中获取类型?

    由于 T4 在项目上下文之外运行 因此我无权访问当前程序集或其他程序集 如何注册对引用程序集的访问 然后从中获取类型 我猜您想访问项目中建筑物的程序集 我在下面的示例代码中所做的是将一个名为 TestLib 的项目添加到我的解决方案中 我将
  • 仅针对某些异常类型中断

    我知道异常处理是一件非常重要的事情 我们在所有项目中都在这样做 主要原因是记录客户发生的错误 这工作正常 根本不是问题 但是 当我仍在使用 Visual Studio 编码和运行应用程序时 我根本不需要任何异常处理 我希望调试器正好停在应用
  • C 中的双重否定:是否保证返回 0/1?

    Is x 标准保证返回0 1 请注意 我是not询问 C 其中定义了 bool 类型 是的 在 C99 中 请参阅 6 5 3 3 4 逻辑非运算符的结果 是0如果其操作数的值比较 不等于0 1如果其操作数的值比较等于 0 结果具有类型in
  • 我们什么时候应该在.NET中使用NativeMemory.Alloc()? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 NET6 C 引入NativeMemory类 但我不知道什么时候应该使用NativeMemory Alloc 而不是普通的数组实例化
  • 如何检查给定调用站点的重载决策集

    如何检查重载解析集 我在多个调用站点中使用了 4 个相互竞争的函数 在一个调用站点中 我期望调用一个函数 但编译器会选择另一个函数 我不知道为什么 这不是微不足道的 为了了解发生了什么 我正在使用enable if disable if打开
  • 代码块 - 使用大地址感知标志进行编译

    如何使用以下命令在 64 位系统上编译 32 位应用程序LARGE ADRESS AWARE使用代码块标记 我需要使用超过 2GB 的内存 应该是添加的情况 Wl large address aware到链接标志 我不使用 CodeBloc
  • 是否可以在对Where 的调用中调用命名方法?

    我试图从 RedGate 的这本免费电子书中了解 Linq 的一些性能影响ftp support red gate com ebooks under the hood of net memory management part1 pdf f
  • 多个包含带有变量定义的头文件

    我只是构建一个简单的 C 项目 代码如下所示 head h ifndef HEAD H define HEAD H int my var 100 endif src1 cpp include head h src2 cpp include
  • PowerShell 与 MongoDB C# 驱动程序方法不兼容?

    由 C 泛型引起的最新 MongoDB 驱动程序的问题 Cannot find an overload for GetCollection and the argument count 1 我可能可以使用其他没有泛型的 GetCollect
  • 为什么将未使用的返回值转换为 void?

    int fn void whatever void fn 是否有任何理由将未使用的返回值强制转换为 void 或者我认为这完全是浪费时间 David s answer https stackoverflow com questions 68
  • 如何在RcppParallel中调用用户定义的函数?

    受到文章的启发http gallery rcpp org articles parallel distance matrix http gallery rcpp org articles parallel distance matrix 我
  • OpenSSL:无需 SSL_read() / SSL_write() 即可执行加密/解密

    我已经用 C 语言编写了一个基于事件的网络库 现在我想通过 OpenSSL 添加 SSL TLS 支持 而不是使用SSL read and SSL write 我宁愿让 OpenSSL 只执行传出 传入数据的加密 解密 让我自己传输 接收数
  • 为什么 getch 不可移植?

    是什么使得 getch 本质上无法作为标准 C 函数包含在内 对于控制台界面来说 它是如此直观和优雅 如果没有它 要求输入单个字符总是会产生误导 因为用户可以输入多个键 更糟糕的是 您经常需要确保在读取控制台输入后清除标准输入 这甚至不是作
  • 在地图上使用 find

    如何使用 find 和 aconst iterator如果你有一个地图定义为 typedef std pair

随机推荐

  • 在 Ruby on Rails 中链接到外部文件

    在 Ruby on Rails 中链接到外部文件 我有一个文件想要在我的 Rails 应用程序中作为链接共享 我在 erb 文件中创建了一个指向它的链接 如下所示 li a href somefile pdf Some File a li
  • Python PANDAS:堆栈和枚举日期以创建新记录

    我目前有一个具有以下通用格式的数据框 id transaction dt units measure 1 2014 01 06 30 30 5 1 2014 02 04 5 22 6 我希望实现的目标如下 根据 id 将单位添加到 tran
  • Excel 日期格式不起作用

    我有一个由第三方程序创建的 Excel 工作表 其中一列的日期格式如下 2015 年 1 月 19 日 03 00 00 PM 我希望这些日期以以下格式显示 19 01 2015 我选择了一个或多个单元格 右键单击并选择 设置单元格格式 在
  • 如何在 MATLAB 中有效地标准化向量?有相关的内置函数吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 何时使用左外连接?

    我不明白左外连接 右外连接的概念 也不明白为什么我们需要使用连接 我正在努力解决的问题和我正在工作的表格在这里 Link http www cs ucc ie pipermail cs2501 2011 attachments 201103
  • 使用模板推导传递数组时出现变长数组错误

    您好 在编译以下内容时出现错误 我不确定为什么会这样 如果我将它们更改为像 10 20 这样的 const 值 它可以工作 但似乎不喜欢该变量 即使这是一个声明 因此它不会改变尺寸 我很困惑为什么会发生此错误 请帮助 参见下面的代码 inc
  • mmap 与 O_DIRECT 进行随机读取(涉及哪些缓冲区?)

    我正在实现一个基于磁盘的哈希表 支持大量键 26 百万 该值被反序列化 整个文件的读取本质上是随机的 值小于页面大小 并且我正在针对 SSD 进行优化 安全性 一致性并不是那么大的问题 性能很重要 我当前的解决方案涉及使用mmap 文件与M
  • 如何在android中获取移动设备的纬度和经度?

    如何使用定位工具在android中获取移动设备当前的纬度和经度 Use the LocationManager https developer android com reference android location LocationM
  • JLabel 在显示 HTML 时垂直向下移动文本

    我想了解为什么渲染 HTML 的 JLabel 会移动其输出文本的垂直位置 而渲染非 HTML 的 JLabel 则不会 使用的Java版本 1 6 0 37 使用 Swing 的外观和感觉 Windows com sun java swi
  • 按钮和输入不继承主体的字体系列

    有人可以帮助我理解为什么user agent stylesheet 至少在 Chrome 中 优先于body for font family on 我的网站在这里 http snakegamerecreation org snakegame
  • JPA 和 Hibernate 初始化非惰性集合错误

    在我的 JavaFX 应用程序中当我使用非惰性收集使用 EmbeddedId 类的选项 为了维护双向关系 它将产生以下异常 经过几个小时的工作后我仍然无法修复它 实体类如下 谢谢 嵌入式Id类 Embeddable public class
  • 在 Mongoose 中使用 ISODate 的正确方法是什么

    我正在尝试使用 mongoose 调用 mongodb 集合 但在调用中使用日期时遇到问题 const siteReviews await Review countDocuments clientId clientObj ClientBra
  • 是否有工具可以用于可视化设计 Swagger REST API,然后生成 Swagger 规范 YAML 规范?

    如今 每个人都在制作 REST 应用程序 到目前为止 我只使用 swagger 编辑器来生成这些文件 有谁知道是否有成熟的工具或IDE能够直观地设计Swagger REST API 然后生成Swagger规范YAML规范文件 工具可以是商业
  • 如何使函数参数容器独立

    我正在编写一个实用函数 它将采用元素向量 可以是 string int double char 并将其连接成单个字符串并返回它 它看起来像这样 template
  • 尝试在 Windows 上安装 pyodbc 时出现“Microsoft Visual C++ … is required”错误

    我正在尝试安装pyodbc 我收到以下错误 C Python Python37 Scripts gt pip3 install pyodbc Output Collecting pyodbc Using cached https files
  • C# System.Xml.Serialization 自嵌套元素

    我正在尝试反序列化
  • 范围 (2-16) 的正则表达式

    我想匹配 2 到 16 之间的数字 跨越 1 位数到 2 位数 正则表达式 info有例子 http www regular expressions info numericranges html对于 1 或 2 位数字范围 但不跨越两者
  • 仅 Tar 目录结构

    我想复制不包括文件的目录结构 tar 中是否有任何选项可以忽略所有文件并仅递归复制目录 您可以使用 find 来获取目录 然后将它们打包 find type d print0 xargs 0 tar cf dirstructure tar
  • 监控应用程序电量使用情况

    有没有办法以编程方式访问settings gt about phone gt battery usage东西 我们想监控我们的应用程序使用了多少电量 有没有办法以编程方式访问设置 gt 关于手机 gt 电池使用情况 唉 不 我们想监控我们的
  • 如何获得显示器正确的物理尺寸?

    如何获得显示器的尺寸 以厘米或英寸为单位 此代码并不总是正确工作 HDC hdc CreateDC T DISPLAY dd DeviceName NULL NULL int width GetDeviceCaps hdc HORZSIZE