gpt4 book ai didi

macos - NSScreen 获取投影仪/电视输出/AirPlay 屏幕?

转载 作者:行者123 更新时间:2023-12-03 16:20:18 26 4
gpt4 key购买 nike

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

我想到了一些选择:

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% 正确的启发法,但话又说回来,在大多数情况下选择正确的屏幕就足够了。

最佳答案

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

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

  • Macbook Air 13 英寸:{290, 180} 毫米,126 ppi
  • Apple Cinema Display:{596, 336} 毫米,109 ppi
  • 爱普生投影仪:{799, 450} 毫米,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);
}
}

关于macos - NSScreen 获取投影仪/电视输出/AirPlay 屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20474596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com