2013-12-09 42 views
3

獲取NSScreen實例最有可能是投影儀或AirPlay顯示屏的最佳方式是什麼? (甚至電視輸出?)我正在編寫演示文稿軟件,並需要知道哪個屏幕最有可能代表「演示文稿」屏幕。NSScreen獲取投影機/電視輸出/ AirPlay屏幕?

一些選項來考慮:

A.使用第二種情況,如果有任何。當然,如果連接兩個以上的屏幕,這顯然不會帶來好的結果。

NSScreen* projectorScreen = [NSScreen mainScreen]; 
NSArray* screens = [NSScreen screens]; 
if(screens.count > 1) { 
    projectorScreen = screens[1]; 
} 

B.如果第一個屏幕不是主屏幕,請使用第一個屏幕。其背後的原因是,在鏡像的情況下,第一個屏幕應該是具有最高像素深度的屏幕。

NSScreen* projectorScreen = [NSScreen mainScreen]; 
NSArray* screens = [NSScreen screens]; 
if(screens.count > 1) { 
    if(screens[0] != projectorScreen) { 
     projectorScreen = screens[0]; 
    } 
} 

C.使用最低的屏幕,而不是主屏幕。原因只是選擇任何的屏幕即而不是的主屏幕。

NSScreen* projectorScreen = [NSScreen mainScreen]; 
NSArray* screens = [NSScreen screens]; 
if(screens.count > 1) { 
    for(NSScreen* screen in screens) { 
     if(screen != projectorScreen) { 
      projectorScreen = screen; 
      break; 
     } 
    } 
} 

D.使用NSScreendeviceDescription字典,找到的最大的屏幕在真實世界座標。這是NSDeviceSize的寬度和高度NSDeviceResolution和理論上這應該產生一個平方英寸面積。不過,我並不完全相信操作系統知道每個屏幕的實際大小。

其他建議?

授予沒有任何100%正確的啓發式,但是再次,大多數時間選擇正確的屏幕應該是足夠的。

+0

E.彈出菜單。 –

+0

彈出菜單可以指示投影屏幕? – adib

+1

詳細說明:你的第五個選擇是有一個彈出式菜單,在其中列出所有的屏幕,並讓用戶選擇他們想要呈現的任何屏幕。 (沒有發佈爲答案,因爲您的問題對於選擇默認設置仍然有效。) –

回答

1

看起來像選項(D)是最好的,有一些變化。顯然,OS X對顯示器的實際尺寸有一個很好的想法,你可以get it via CGDisplayScreenSize。然後選擇最大的一個,然後假設這是演示屏幕,這非常簡單。

授予這並不能準確地測量投影儀,但我的非正式的測試表明,該函數返回每英寸值相當不錯的像素,每個屏幕:

  • 的MacBook空氣13" :{290,180}毫米, 126 PPI
  • 蘋果Cinema顯示:{596,336}毫米,109 PPI
  • 一個Epson高架投影機:{799,450}毫米,61 PPI

(以上被轉換以恆定的25.4 millime ters每英寸)。

下面是我使用的代碼:

#import <Foundation/Foundation.h> 
#import <AppKit/AppKit.h> 
#import <ApplicationServices/ApplicationServices.h> 

int main(int argc, char *argv[]) { 
    @autoreleasepool { 
     NSArray* screens = [NSScreen screens]; 
     CGFloat __block biggestArea = 0; 
     NSScreen* __block presentationScreen; 
     NSUInteger __block presentationScreenIndex; 
     [screens enumerateObjectsUsingBlock:^(NSScreen* screen,NSUInteger idx,BOOL* stop){ 
      NSDictionary *description = [screen deviceDescription]; 
      NSSize displayPixelSize = [[description objectForKey:NSDeviceSize] sizeValue]; 
      CGSize displayPhysicalSize = CGDisplayScreenSize(
         [[description objectForKey:@"NSScreenNumber"] unsignedIntValue]); 

      NSLog(@"Screen %d Physical Size: %@ ppi is %0.2f",(int) idx, NSStringFromSize(displayPhysicalSize), 
        (displayPixelSize.width/displayPhysicalSize.width) * 25.4f); 
        // there being 25.4 mm in an inch 
      CGFloat screenArea = displayPhysicalSize.width * displayPhysicalSize.height; 
      if(screenArea > biggestArea) { 
       presentationScreen = screen; 
       biggestArea = screenArea; 
       presentationScreenIndex = idx; 
      } 
     }]; 
     NSLog(@"Presentation screen: index: %d %@",(int) presentationScreenIndex,presentationScreen); 
    } 
}