2013-12-09 5 views
3

Каков наилучший способ получить экземпляр NSScreen, который скорее всего будет проектором или дисплеем AirPlay? (или даже TV-Out?) Я пишу презентационное программное обеспечение и должен знать, какой экран, который скорее всего представляет экран презентации.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. Использование NSScreen «s deviceDescription словарь и найти самый большой экран в реальном мире координат. Это разделит ширину и высоту NSDeviceSize на NSDeviceResolution, и теоретически это должно дать площадь в квадратных дюймах. Однако я не совсем уверен, что ОС знает реальный размер каждого экрана.

Любые другие предложения?

Предоставлено не существует 100% правильной эвристики, но опять же, выбор правильного экрана в течение большей части времени должен быть достаточным.

+0

E. Всплывающее меню. –

+0

Всплывающее меню может отображать проекционный экран? – adib

+1

Чтобы уточнить: ваш пятый выбор состоит в том, чтобы иметь всплывающее меню, в котором вы перечисляете все экраны, и позволяете пользователю выбирать любой экран, который они хотят представить. (Не опубликовано как ответ, потому что ваш вопрос по-прежнему действителен для выбора значения по умолчанию.) –

ответ

1

Похоже, что вариант (D) является лучшим, с некоторыми изменениями. По-видимому OS X имеет довольно хорошее представление о реальном размере дисплея, и вы можете get it via CGDisplayScreenSize. Тогда довольно просто выбрать самую большую и предположить, что это экран презентации.

Конечно это не точно измерить проекторы, но мое неофициальное тестирование показывает, что функция возвращает довольно хороший пиксель за значения дюйма для каждого экрана:

  • Macbook Air 13" : {290, 180} мм, 126 PPI
  • Apple Cinema Display: {596, 336} мм, 109 PPI
  • Epson кинопроектор: {799, 450} мм, 61 PPI

(выше были преобразованы с постоянной 25,4 millime на дюйм).

Вот код, который я использовал:

#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); 
    } 
} 
Смежные вопросы