【问题标题】:How to get all possible screen resolutions in cocoa?如何在可可中获得所有可能的屏幕分辨率?
【发布时间】:2018-10-30 12:52:23
【问题描述】:

我想获取所有支持的 mac 屏幕分辨率。 我正在使用以下代码来实现所有支持的分辨率:

CFArrayRef modeList;
modeList=CGDisplayCopyAllDisplayModes(displays[i], NULL);

通过使用上面的代码,我只能得到如下图所示的分辨率:

我已经安装了一个应用程序,它显示了我的 Mac 屏幕支持的分辨率。它显示了如下图所示的分辨率。我也想获得更高的分辨率。

我参考了以下链接: CGDisplayCopyAllDisplayModes leaves out one valid mode

但我不知道如何使用 kCGDisplayShowDuplicateLowResolutionModes 获得其他支持的分辨率。

【问题讨论】:

    标签: objective-c macos cocoa screen-resolution


    【解决方案1】:

    您提供的链接中接受的答案确实提供了您需要的答案,尽管它使用了一个不幸的未记录选项标志。您必须将选项字典传递给您对CGDisplayCopyAllDisplayModes 的调用,因为它表明:

    CGDirectDisplayID mainDisplayID = CGMainDisplayID();
    CFStringRef keys[1] = { kCGDisplayShowDuplicateLowResolutionModes };
    CFBooleanRef values[1] = { kCFBooleanTrue };
    
    CFDictionaryRef options = CFDictionaryCreate(kCFAllocatorDefault, (const void**) keys, (const void**) values, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks );
    
    CFArrayRef modesArray = CGDisplayCopyAllDisplayModes( mainDisplayID, options );
    

    然后查看返回的显示模式似乎对我有用。请注意,您可能需要检查 CGDisplayModeIsUsableForDesktopGUI(…) 返回的布尔值以过滤掉无效的值(取决于您的用例)。

    显然,您将依次传递每个不同的显示 id,并获得更像这样的输出:

    Display 3: external, main
    points: (2560 x 1440), pixels: (2560, 1440)
    points: (1280 x 720), pixels: (1280, 720)
    points: (800 x 600), pixels: (800, 600)
    points: (1024 x 768), pixels: (1024, 768)
    points: (1280 x 960), pixels: (1280, 960)
    points: (1344 x 1008), pixels: (1344, 1008)
    points: (1344 x 756), pixels: (1344, 756)
    points: (1600 x 1200), pixels: (1600, 1200)
    points: (1600 x 900), pixels: (1600, 900)
    points: (2048 x 1152), pixels: (2048, 1152)
    
    Display 2: builtin,
    points: (2880 x 1800), pixels: (2880, 1800)
    points: (1440 x 900), pixels: (1440, 900)
    points: (3360 x 2100), pixels: (3360, 2100)
    points: (2560 x 1600), pixels: (2560, 1600)
    points: (2048 x 1280), pixels: (2048, 1280)
    points: (1650 x 1050), pixels: (1650, 1050)
    points: (1280 x 800), pixels: (1280, 800)
    points: (1152 x 720), pixels: (1152, 720)
    points: (1024 x 768), pixels: (1024, 768)
    points: (800 x 600), pixels: (800, 600)
    
    Display 5: external,
    points: (1920 x 1200), pixels: (1920, 1200)
    points: (960 x 600), pixels: (960, 600)
    points: (800 x 600), pixels: (800, 600)
    points: (1024 x 768), pixels: (1024, 768)
    points: (1024 x 640), pixels: (1024, 640)
    points: (1280 x 960), pixels: (1280, 960)
    points: (1280 x 800), pixels: (1280, 800)
    points: (1344 x 1008), pixels: (1344, 1008)
    points: (1344 x 840), pixels: (1344, 840)
    points: (1600 x 1200), pixels: (1600, 1200)
    points: (1600 x 1000), pixels: (1600, 1000)
    

    另外请注意,这些数字与 MBP 显示的数字不一致。 “看起来像 1920 x 1200”,与列出的任何分辨率都不匹配。


    另一个开发者在让这个工作时遇到了麻烦,所以我将我快速破解的测试项目推送到了 github,以便其他人可以看到 entire working project。希望这会对某人有所帮助(在您将其用于任何类型的产品之前清理该代码 - 它只是一个最快的组合测试代码)。

    【讨论】:

    • 头文件中的文档文档。 ;)
    • :) 是的,好吧,头文件中的文档清楚地表明““选项”字段是为将来扩展保留的;现在传递 NULL。因此,该标志被记录为存在,但没有表明它的用途或它是 CGDisplayCopyAllDisplayModes 的有效参数。因此我的评论。
    • 啊,我错过了你的眨眼。 ;) 确实。
    • @swapnil-patel 如果这回答了您的问题,您可以接受它让我们知道并将其从关于 SO 的未回答问题列表中删除。如果这不能回答您的问题,请说明哪一部分不适合您。干杯!
    • @Dad 在通过kCGDisplayShowDuplicateLowResolutionModes 后仍然得到相同的分辨率(几个分辨率)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多