NSScreen获得投影仪/电视输出/ AirPlay屏幕?

时间:2013-12-09 15:42:38

标签: macos cocoa appkit

获取最有可能是投影仪或AirPlay显示屏的NSScreen实例的最佳方法是什么? (甚至TV-Out?)我正在编写一个演示软件,需要知道哪个屏幕最有可能代表“演示”屏幕。

我想到了一些选择:

一个。如果有的话,使用第二个实例。当然,如果附加两个以上的屏幕,这显然不会给出好的结果。

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];
    }
}

℃。使用主屏幕的最低屏幕。原因只是选择 主屏幕的任何屏幕。

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的{​​{1}}词典,找到真实世界坐标中最大的屏幕。这是deviceDescription的宽度和高度除以NSDeviceSize,理论上这应该产生一个平方英寸的面积。但是我并不完全相信操作系统知道每个屏幕的实际大小。

还有其他建议吗?

当然,没有任何100%正确的启发式方法,但是再次,在大多数情况下选择正确的屏幕就足够了。

1 个答案:

答案 0 :(得分:2)

看起来选项(D)是最好的,有一些变化。显然OS X对显示器的真实尺寸有很好的了解,你可以get it via CGDisplayScreenSize。然后选择最大的一个并假设是演示屏幕非常简单。

虽然这不能准确测量投影仪,但我的非正式测试显示该函数为每个屏幕返回相当不错的每英寸像素值:

  • Macbook Air 13“:{290,180} mm,126 ppi
  • Apple Cinema Display:{596,336}毫米,109 ppi
  • 爱普生高架投影仪:{799,450} mm,61 ppi

(以上每英寸转换为25.4毫米)。

以下是我使用的代码:

#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);
    }
}