- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Mac OS X 中,每个显示器都有一个分配给它的唯一 CGDirectDisplayID
编号。您可以使用 CGGetActiveDisplayList(
) 或 [NSScreen screens]
访问它们等。每Apple's docs :
A display ID can persist across processes and system reboot, and typically remains constant as long as certain display parameters do not change.
在较新的 2010 年中期 MacBook Pro 上,Apple 开始使用自动切换 Intel/nVidia 显卡。膝上型电脑有两个 GPU,一个低功率的 Intel 和一个高功率的 nVidia。以前的双 GPU 笔记本电脑(2009 型号)没有自动 GPU 切换功能,需要用户更改设置、注销,然后再次登录才能进行 GPU 切换。甚至更旧的系统也只有一个 GPU。
2010 年中期的型号存在一个问题,当显示器从一个 GPU 切换到下一个时,CGDirectDisplayID 不会保持不变。例如:
我的问题是,当旧显示器 ID 因 GPU 更改而改变时,我如何将它们与新显示器 ID 匹配?
思考:
我注意到显示器 ID 只改变了 2,但我没有足够的测试 Mac 可用以确定这是否对所有新 MacBook Pro 都通用,或者只是我的。无论如何,如果“只检查彼此相差 +/-2 的显示 ID”是否有效,那就有点麻烦了。
尝试过:
CGDisplayRegisterReconfigurationCallback()
,它在显示将要改变之前和之后通知,没有匹配逻辑。把这样的东西放在一个用它注册的方法里是行不通的:
// Run before display settings change:
CGDirectDisplayID directDisplayID = ...;
io_service_t servicePort = CGDisplayIOServicePort(directDisplayID);
CFDictionaryRef oldInfoDict = IODisplayCreateInfoDictionary(servicePort, kIODisplayMatchingInfo);
// ...display settings change...
// Run after display settings change:
CGDirectDisplayID directDisplayID = ...;
io_service_t servicePort = CGDisplayIOServicePort(directDisplayID);
CFDictionaryRef newInfoDict = IODisplayCreateInfoDictionary(servicePort, kIODisplayMatchingInfo);
BOOL match = IODisplayMatchDictionaries(oldInfoDict, newInfoDict, 0);
if (match)
NSLog(@"Displays are a match");
else
NSLog(@"Displays are not a match");
上面发生的事情是:
IODisplayMatchDictionaries()
IODisplayMatchDictionaries()
返回一个 BOOL,要么 YES 它们相同,要么 NO 它们不同。不幸的是,如果同一显示器更改了 GPU,IODisplayMatchDictionaries()
不会返回 YES。这是它正在比较的字典的示例(查看 IODisplayLocation
键):
// oldInfoDict (Display ID: 30002)
oldInfoDict: {
DisplayProductID = 40144;
DisplayVendorID = 1552;
IODisplayLocation = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer/display0/AppleBacklightDisplay";
}
// newInfoDict (Display ID: 30004)
newInfoDict: {
DisplayProductID = 40144;
DisplayVendorID = 1552;
IODisplayLocation = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPCI2PCIBridge/GFX0@0/NVDA,Display-A@0/NVDA/display0/AppleBacklightDisplay";
}
如您所见,切换 GPU 时 IODisplayLocation
键会发生变化,因此 IODisplayMatchDictionaries()
不起作用。
理论上,我可以只比较 DisplayProductID
和 DisplayVendorID
键,但我正在编写最终用户软件,并且担心用户有两个键的情况或插入更多相同的显示器(意味着它们将具有相同的 DisplayProductID/DisplayVendorID)。换句话说,这是一个不够完美的解决方案,容易出现潜在故障。
非常感谢任何帮助! :)
最佳答案
使用 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 中可用。
关于objective-c - 如何解决 Core Foundation/IO Kit 中较新的多 GPU Apple 笔记本电脑上的 CGDirectDisplayID 更改问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2861871/
一直以来中国版Apple Watch心不支持心电图功能,不过近日Apple Watch心电图终于在国行版上线了!那么Apple Watch心国内版心电图要如何使用呢?下面一起来看看吧! App
我正在尝试将“使用 Apple 登录”添加到我现有的 App ID。检查启用它的选项后,显示以下弹出窗口:带有此消息: If you're enabling an App ID for the fir
我有一个并发症,可能需要每 5 分钟更新一次。这很容易总结为每天 120 次更新。有没有办法只在用户唤醒 watch 时更新? 最佳答案 我认为您的问题的答案是否,目前没有办法只在用户唤醒 watch
我们正在测试新 Sign in with Apple我们的应用程序的功能,并且在初始请求时,我们会提供用户的全名和电子邮件地址(如果用户启用了这些选项)。 但是在随后的请求中,此数据不仅提供 iden
在我的苹果 watch 扩展中,我想使用长按手势功能。是否有任何 api 等效于 UILongPressGestureRecognizer。我的要求是,在 watch 扩展上,我有表格想要长按单元格,
有没有办法以编程方式显示苹果 map 中多个点之间的路线,如谷歌地图? 最佳答案 正如 MKMapItem 文档所述: If you specify the MKLaunchOptionsDirect
我一直在互联网上关注很多教程来学习如何设置并发症。按预期设置并发症我没有问题。 直到初始时间线条目过期。 12 小时后,我不知道如何更新它以保持并发症的存在。我将在下面分享我拥有的所有内容,希望有人可
我看到一本书的描述...... 书上说 /^Apple/ 会匹配字符串开头有一个 Apple 的字符串。所以它将匹配 Apple Apple1 AppleApple AppleABC ...... 书
众所周知,您可以禁止从允许接收 Apple 通知的应用程序接收通知。但是有谁知道禁用是在本地进行的(忽略 Apple 发送到应用程序的通知),还是 Apple 停止从它的服务器向您发送通知? 最佳答案
我有一个 Apple id,我正在构建一个使用 Apple 推送通知服务的应用程序,但我对此有点困惑。 Apple 执行此过程是否收费?它可以在安装了我的应用程序的特定数量的设备上运行是否有任何限制?
我正在制作一个音频播放器应用。 在苹果的音乐应用中,如果音乐专辑或播客没有插图,则显示音符图像或播客图标图像而不是插图。 我想做同样的事情。 我可以在我的应用程序中使用苹果音乐应用程序中的图像吗? 苹
我有一个自定义框架,我正在归档以在另一个项目中使用。更新到 Xcode11 后,我在使用该框架的项目中收到以下错误。 找不到目标“x86_64-apple-ios-simulator”的模块“MyCu
我有一个在 iOS 上运行良好的应用程序,但是当使用催化剂运行时,如果我在 macOS 上滑动到另一个虚拟桌面,然后再返回大约 10 次,它会间歇性地崩溃。它主要发生在 UICollectionVie
我正在使用 Xcode 开发 Apple Watch 应用程序。我想在屏幕的左上角放置一些文本,与列出时间的位置相邻。 当我将标签向上拖动到屏幕的一部分时,它会自动向下对齐。 我看到大多数 Apple
我似乎找不到在哪里设置我的 Apple Watch 应用程序的产品名称。我确实看到了产品名称选项,但更新它没有任何作用。也看不到文档中的任何内容 最佳答案 为了让您的应用程序名称在 iPhone 上的
问题:如何在我的服务器产品的安装程序中安全地包含推送通知所需的 SSL 证书? 背景:Apple 推送通知要求客户端 SSL 证书位于向 Apple 发出调用的服务器上。 我的产品采用传统的客户端/服
我已经在我的网站上实现了 Sign In with Apple。但问题是它只适用于我开发者的 Apple ID。 我尝试在同一环境中使用我的个人 Apple ID,并且登录过程也运行良好。 但是,当真
我的苹果触摸图标中的白色背景变黑了??我的白色背景不透明。该图标有一个白色三角形、红色圆圈和黑色文本。我唯一能辨认出来的是白色三角形和红色圆圈。知道是什么导致了这种情况以及如何使图标保持白色背景吗?
我正在考虑制作一个使用加速度计的 watchOS2 应用程序。如果应用程序在后台运行,它是否仍然能够接收来自加速度计或 CMMotionManager 的输入? 最佳答案 只有当 watchOS2 应
我想切换 Apple App Loader 使用的 Apple ID。 我找不到更改应用程序本身使用的帐户的方法。谷歌搜索没有带来任何有用的信息。当我启动加载程序应用程序时,它给我一个错误:“...您
我是一名优秀的程序员,十分优秀!