使用NSScreen确定连接到MacBook计算机的外部屏幕

时间:2016-05-12 14:01:35

标签: swift macos

我需要在外部屏幕上显示一个窗口(例如连接到Macbook的显示器)。但我不知道如何区分内部MacBook屏幕和外部MacBook屏幕。调用NSScreen.screens()返回所有屏幕的列表,在我的案例屏幕中,索引为0是我连接的外部屏幕,索引为1的屏幕是我的内置(内置)MacBook屏幕。但文档说:

  

返回数组中索引0处的屏幕对应于用户系统的主屏幕。

那么为什么我的连接屏幕被标记为主屏幕?所有系统上的外部屏幕都标记为primary =>我可以假设在所有连接外部屏幕的系统上,此屏幕是否在0位置?

此外,OS X底座仅在我的内部屏幕上可见,我认为默认情况下底座在主屏幕上可见,但事实并非如此。

有没有办法可靠地确定正确的外部屏幕?

2 个答案:

答案 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()函数来确定显示是否内置。