Objective c 是否更改了屏幕数量(随机)?

Objective c 是否更改了屏幕数量(随机)?,objective-c,macos,cocoa,screen,Objective C,Macos,Cocoa,Screen,在我的应用程序中,我需要使用NSScreen提供的deviceDescription字典的NSScreenNumber键来区分不同的显示。到目前为止,一切工作都完美无缺,但现在突然间,我的主屏幕上有时会出现不同的屏幕ID(这是一台笔记本电脑,我已经几个月没有连接第二个屏幕了,它总是相同的硬件)。这个id以前是69676672,但现在大部分时间我都是2077806975 起初,我认为我可能在某种程度上误解了NSNumber,但事实并非如此,我还使用CGMainDisplayID()函数进行了检查,

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

起初,我认为我可能在某种程度上误解了NSNumber,但事实并非如此,我还使用CGMainDisplayID()函数进行了检查,得到了相同的值。更奇怪的是,一些苹果应用程序似乎仍然使用旧ID:例如,桌面映像在其配置文件中使用屏幕ID引用,而苹果的桌面映像应用程序在更新桌面映像时使用的是“正确的”(=旧)ID

我开始怀疑最近的更新(10.7.1或10.7.2)中是否有导致更改的更改,是否有其他人注意到类似的情况或以前有过此问题

以下是我使用的代码:

 // This is in an NSScreen category
 - (NSNumber *) uniqueScreenID {
     return [[self deviceDescription] objectForKey:@"NSScreenNumber"];
 }
为了得到一个整数:

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

这开始令人沮丧,感谢您的帮助/想法,谢谢

对于具有内置图形卡和离散图形卡的Mac(如带有板载Intel图形卡和单独图形卡的MacBook Pro机型),当系统自动在两者之间切换时,显示ID可能会发生变化。您可以在节能器prefs面板中禁用“自动图形切换”,以测试这是否是导致屏幕编号更改的原因(禁用时,将始终使用离散图形卡)

在这样的系统上,在特定时间使用哪些图形取决于当前正在运行的应用程序及其需求。例如,我相信应用程序使用OpenGL会导致切换到离散图形卡


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

当机器从睡眠中唤醒时,显示经常被重新枚举,因此您是否在轮询之间进入睡眠状态?是的,机器在两次轮询之间已多次重新启动,我知道该值可能会更改,恕不另行通知(甚至在docu中这样说,尽管他们暗示这种情况不应该经常发生)。让我困惑的是苹果软件(例如dock的桌面图像管理部分)当使用API的第三方应用程序不使用时,仍然会得到旧的值。但我猜他们一定是在做某种缓存或使用不同的API。向苹果提交一个bug,Robin。啊,这很有意义,从来没有想过。实际上,我现在已经改变了我的系统,不再依赖NSScreenNumber,但这绝对是一个有用的hint如果我需要回去的话,非常感谢!