【问题标题】:NSScreen get the projector/TV Out/AirPlay screen?NSScreen 获取投影仪/电视输出/AirPlay 屏幕?
【发布时间】:2013-12-26 19:07:27
【问题描述】:

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

想到了一些选项:

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.使用不是主屏幕的最低屏幕。原因只是选择 any 不是主屏幕的屏幕。

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

还有其他建议吗?

当然,没有任何 100% 正确的启发式方法,但话又说回来,大部分时间选择正确的屏幕就足够了。

【问题讨论】:

  • 弹出菜单可以指示投影画面吗?
  • 详细说明:您的第五个选择是有一个弹出菜单,您可以在其中列出所有屏幕,并让用户选择他们想要呈现的任何屏幕。 (未发布为答案,因为您的问题对于选择默认值仍然有效。)

标签: macos cocoa appkit


【解决方案1】:

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

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

  • Macbook Air 13":{290, 180} 毫米,126 ppi
  • Apple 影院显示器:{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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多