我需要在外部屏幕上显示一个窗口(例如连接到Macbook的显示器)。但我不知道如何区分内部MacBook屏幕和外部MacBook屏幕。调用NSScreen.screens()
返回所有屏幕的列表,在我的案例屏幕中,索引为0是我连接的外部屏幕,索引为1的屏幕是我的内置(内置)MacBook屏幕。但文档说:
返回数组中索引0处的屏幕对应于用户系统的主屏幕。
那么为什么我的连接屏幕被标记为主屏幕?所有系统上的外部屏幕都标记为primary =>我可以假设在所有连接外部屏幕的系统上,此屏幕是否在0位置?
此外,OS X底座仅在我的内部屏幕上可见,我认为默认情况下底座在主屏幕上可见,但事实并非如此。
有没有办法可靠地确定正确的外部屏幕?
答案 0 :(得分:3)
为了扩展werediver的答案,这是一个实现:
extension NSScreen {
class func externalScreens() -> [NSScreen] {
guard let screens = NSScreen.screens() else { return [] }
return screens.filter {
guard let deviceID = $0.deviceDescription["NSScreenNumber"] as? NSNumber else { return false }
return CGDisplayIsBuiltin(deviceID.unsignedIntValue) == 0
}
}
}
用法很简单:
let externalScreens = NSScreen.externalScreens()
您可能需要根据需要调整guard
语句'else
块中的行为。
答案 1 :(得分:2)
NSScreen Class Reference页面的开头有一个注释:
请注意
NSScreen类仅用于获取有关可用显示的信息。如果您需要其他信息或想要更改与显示相关的属性,则必须使用Quartz Services。有关更多信息,请参阅Quartz Display Services Reference。
从Quartz Display Services Reference我们可以了解到主屏幕不是必需的内置屏幕。来自CGMainDisplayID()说明:
主显示屏是屏幕位置为(0,0)的显示屏 全局显示坐标空间。在没有显示的系统中 镜像,菜单栏的显示通常是主要的 显示。
如果启用了镜像,并且菜单栏出现在多个上 显示,此功能提供了查找主要的可靠方法 显示。
在硬件镜像的情况下,可绘制的显示器成为主要的 显示。在软件镜像的情况下,显示最高 分辨率和最深像素深度通常成为主要显示器。
因此,如果您可以直接使用Quartz Display Services,使用CGDisplayIsBuiltin()函数来确定显示是否内置。