CGDirectDisplayID,多个GPU,不推荐使用CGDisplayIOServicePort并唯一标识显示

 欧阳闯恋365 发布于 2023-01-08 11:02

我需要唯一地识别显示器,以达到显示器确实在特征上不同的程度.因此,插入同一物理端口的相同型号的显示器不会被视为不同,但基本上其他一切都将被视为不同.

当系统GPU更改时,CGDirectDisplayID也会更改,但不会以文档的方式更改.实验表明,根据使用的GPU,相同的屏幕ID将相差2.

CGDisplayID更改问题

解决此问题的方法是获取显示的IO注册表字符串:

io_service_t  servicePort = CGDisplayIOServicePort (cgDisplayID);
io_service_t  root = IODisplayForFramebuffer (servicePort, kNilOptions);
NSDictionary* ioRegistryDict = nil;
NSString*     displayKey = nil;

IORegistryEntryCreateCFProperties (root, (CFMutableDictionaryRef *)&ioRegistryDict, kCFAllocatorDefault, kNilOptions);

if (ioRegistryDict)
    displayKey = [ioRegistryDict objectForKey:@"IODisplayPrefsKey"];

这很有效,除了10.9之外,不推荐使用CGDisplayIOServicePort.

鉴于所有这些,以及Apple建议不要缓存NSScreens(无论如何都不能真正用于此目的),可靠地识别屏幕的最佳方法是什么,以便我可以告诉(例如)家中的屏幕之间的区别一个在工作?

我不想依赖屏幕分辨率,因为不应将用户更改分辨率视为不同的显示.也不应该将不同GPU上的相同屏幕视为不同.

第二个目标是找到一种给定CGDirectDisplayID的方法,如果发生GPU切换,如何确定同一屏幕的CGDirectDisplayID是什么?这至少允许我通过CGDirectDisplayID跟踪显示,只要我可以匹配来自两个GPU控制器的两个结果.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有