2016-05-12 123 views
0

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

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

那么为什么我的连接屏幕标记为主要?所有系统上的外部屏幕是否标记为主要=>我能假设在所有连接了外部屏幕的系统上此屏幕位于0位置吗?

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

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

+0

不幸的是,“主显示器的屏幕位置在全局显示坐标空间的(0,0)处。” ([给定](https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/Quartz_Services_Ref/index.html#//apple_ref/c/func/CGMainDisplayID))。 – werediver

回答

1

要在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块行为。

2

有一个在NSScreen Class Reference页的开头记:

注意

的NSScreen类是用于获取有关唯一可用的显示信息。如果您需要更多信息或想要更改与显示器相关的属性,则必须使用Quartz Services。有关更多信息,请参阅Quartz显示服务参考。

Quartz Display Services Reference我们可以了解到,主屏幕没有必要内置一个。从CGMainDisplayID()描述:

主显示与它的屏幕位置(0,0)在 全球显示器坐标空间中的显示。在没有显示 镜像的系统中,带菜单栏的显示器通常是主显示器 。

如果启用了镜像并且多个 显示屏上出现菜单栏,则此功能提供了一种可靠的方法来查找主显示器 。

在硬件镜像的情况下,可绘制显示屏变成主显示屏 。在软件镜像的情况下,具有最高分辨率和最深像素深度的显示器通常成为主显示器。

所以,如果你可以直接使用Quartz显示服务,使用CGDisplayIsBuiltin()功能确定显示器是否是内置的或没有。