NSScreenNumber是否随机变化?

Rob*_*bin 5 macos cocoa screen objective-c

在我的应用程序中,我需要区分不同的显示,我使用NSScreen提供的deviceDescription字典的NSScreenNumber键.到目前为止,一切都完美无瑕,但现在突然间我有时会为我的主屏幕获得不同的屏幕ID(这是一台笔记本电脑,我几个月没有连接第二个屏幕,它总是相同的硬件).id曾经是69676672,但现在大多数时候我得到2077806975.

起初我以为我可能会以某种方式误解NSNumber,但事实并非如此,我还通过使用CGMainDisplayID()函数进行检查,并得到相同的值.甚至更奇怪的是,一些Apple应用程序似乎仍然得到旧ID:例如.使用屏幕ID在其配置文件中引用桌面映像,在更新桌面映像时,Apple的桌面映像应用程序使用"正确"(=旧)ID.

我开始怀疑最近的更新(10.7.1或10.7.2)是否会发生变化导致变更,是否有其他人注意到类似的事情或之前有此问题?

这是我使用的代码:

 // This is in an NSScreen category
 - (NSNumber *) uniqueScreenID {
     return [[self deviceDescription] objectForKey:@"NSScreenNumber"];
 }
Run Code Online (Sandbox Code Playgroud)

并获得一个int:

 // Assuming screen points to an instance of NSScreen
 NSLog(@"Screen ID: %i", [[screen uniqueScreenID] intValue]);
Run Code Online (Sandbox Code Playgroud)

这开始变得令人沮丧,感谢任何帮助/想法,谢谢!

小智 3

对于具有内置显卡和独立显卡的 Mac(例如具有板载 Intel 显卡和独立显卡的 MacBook Pro 型号),当系统在两者之间自动切换时,显示 ID 可能会发生变化。您可以在节能器首选项面板中禁用“自动显卡切换”来测试这是否是您屏幕编号变化的原因(禁用时将始终使用独立显卡)。

在此类系统上,在特定时间使用哪些图形的选择取决于当前正在运行的应用程序及其需求。例如,我相信应用程序对 OpenGL 的任何使用都会导致切换到独立显卡。

如果您需要注意应用程序运行时何时发生此类切换,您可以注册一个回调(CGDisplayRegisterReconfigurationCallback)并检查发生的更改(kCGDisplayAddFlag、kCGDisplayRemoveFlag 等)。如果您尝试将显示器与以前使用/遇到的显示器进行匹配,您需要的不仅仅是比较显示器 ID。