2016-05-12 58 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()功能確定顯示器是否是內置的或沒有。

相關問題