我需要唯一地识别显示器,以达到显示器确实在特征上不同的程度。因此,插入同一物理端口的相同型号的显示器不会被视为不同,但基本上其他一切都将被视为。
当系统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"];
这很有效,除了10.9之外,不推荐使用CGDisplayIOServicePort。
考虑到所有这一切,以及Apple的建议不要缓存NSScreens(无论如何都不能用于此目的),可靠地识别屏幕的最佳方法是什么,以便我可以告诉(对于例子)家中的屏幕与工作屏幕之间的区别?
我不想依赖屏幕分辨率,因为不应将用户更改分辨率视为不同的显示。也不应将不同GPU上的相同屏幕视为不同。
第二个目标是找到一种给定CGDirectDisplayID的方法,如果发生GPU切换,如何确定同一屏幕的CGDirectDisplayID是什么?这至少可以让我通过CGDirectDisplayID跟踪显示,只要我可以匹配来自两个GPU控制器的两个结果。
答案 0 :(得分:2)
使用CFUUIDRef,可以使用以下方法获得:
CGDisplayCreateUUIDFromDisplayID(CGDirectDisplayID displayID)
您可以使用以下方式获取显示ID:
CGDisplayGetDisplayIDFromUUID(CFUUIDRef uuid)
即使他们的CGDirectDisplayID发生了变化,例如插入了不同的端口,这也是我用来唯一识别显示的内容。不幸的是,Apple没有正确记录这些功能,但我在多台显示器上进行的测试显示,获得的CFUUIDRef是唯一且一致的 - 即使重启后 - 无论CGDirectDisplayID是否因任何原因而改变。
要检查显示是新的/唯一的,请使用其CGDirectDisplayID并将其转换为CFUUIDRef,然后比较UUID,它是多对一关系,许多CGDirectDisplayID将映射到单个CFUUIDRef。
这些API调用在10.7 - 10.12中的ApplicationServices和10.13中的ColorSync中可用。