Try*_*gve 8 macos xcode gpu retina-display
我需要唯一地识别显示器,以达到显示器确实在特征上不同的程度.因此,插入同一物理端口的相同型号的显示器不会被视为不同,但基本上其他一切都将被视为不同.
当系统GPU更改时,CGDirectDisplayID也会更改,但不会以文档的方式更改.实验表明,根据使用的GPU,相同的屏幕ID将相差2.
解决此问题的方法是获取显示的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"];
Run Code Online (Sandbox Code Playgroud)
这很有效,除了10.9之外,不推荐使用CGDisplayIOServicePort.
鉴于所有这些,以及Apple建议不要缓存NSScreens(无论如何都不能真正用于此目的),可靠地识别屏幕的最佳方法是什么,以便我可以告诉(例如)家中的屏幕之间的区别一个在工作?
我不想依赖屏幕分辨率,因为不应将用户更改分辨率视为不同的显示.也不应该将不同GPU上的相同屏幕视为不同.
第二个目标是找到一种给定CGDirectDisplayID的方法,如果发生GPU切换,如何确定同一屏幕的CGDirectDisplayID是什么?这至少允许我通过CGDirectDisplayID跟踪显示,只要我可以匹配来自两个GPU控制器的两个结果.
使用 CFUUIDRef 可以通过以下方式获得:
CGDisplayCreateUUIDFromDisplayID(CGDirectDisplayID displayID)
您可以使用以下命令取回显示 ID:
CGDisplayGetDisplayIDFromUUID(CFUUIDRef uuid)
这就是我用来唯一标识显示器的方法,即使它们的 CGDirectDisplayID 发生变化(例如插入不同的端口)。不幸的是,Apple 没有正确记录这些函数,但我在具有多个显示器的多台 Mac 上进行的测试表明,获得的 CFUUIDRef 是唯一且一致的(即使在重新启动后),无论 CGDirectDisplayID 是否因任何原因发生更改。
要检查显示器是否是新的/唯一的,请获取其CGDirectDisplayID并将其转换为CFUUIDRef,然后比较UUID,它是多对一的关系,许多CGDirectDisplayID将映射到单个CFUUIDRef。
这些 API 调用在 10.7 - 10.12 中的 ApplicationServices 中以及从 10.13 起的 ColorSync 中可用。
| 归档时间: |
|
| 查看次数: |
931 次 |
| 最近记录: |