CGDisplayCopyAllDisplayModes省略了一个有效模式

时间:2015-06-16 05:50:35

标签: macos swift core-graphics

当以编程方式使用OS X(documentation)中的显示模式时,我发现CGDisplayCopyAllDisplayModes没有排除系统偏好设置中显示的最右边的选项。

打印当前显示模式大小的simple utility和所有可用的显示模式大小输出

current size: 1920x1200
available sizes:
2880x1800
1440x900
2560x1600
2048x1280
1024x768
800x600
640x480
1680x1050
1280x800

1920x1200是有效选项enter image description here

系统偏好设置提供的所有其他选项都显示在列表中。有没有人知道为什么1920x1200可能不包括在内?我已尝试更改为系统首选项中的另一个预定义值,但它不会导致1920x1200被包含。

编辑(接受的答案比这些恶作剧要好得多,但我留下这些信息以防万一)

可以通过引用私有API找到“缩放”显示模式。

您可以创建一个使私有方法可用的头文件:请参阅我从this gist借来的this project

然后你可以看到所有模式,包括像这样的缩放模式

print("Private modes:\n")

var numDisplayModes: Int32 = 0
CGSGetNumberOfDisplayModes(mainDisplayID, &numDisplayModes)
print("Num modes \(numDisplayModes)")

for i in 0...(numDisplayModes-1) {
    var pmode: CGPrivDisplayMode = CGPrivDisplayMode()
    CGSGetDisplayModeDescriptionOfLength(mainDisplayID, CInt(i), &pmode, CInt(sizeof(CGPrivDisplayMode)))

    print("\t\(pmode.modeNumber): \(pmode.width)x\(pmode.height) -- \(pmode.density)  \n")
}

1 个答案:

答案 0 :(得分:4)

公共API仅在标题中记录。 CGDisplayCopyAllDisplayModes()采用options参数,这是一个字典。文档(甚至标题)表示它未使用,您必须通过NULL,但您可以传递一个包含密钥kCGDisplayShowDuplicateLowResolutionModes和值kCFBooleanTrue的字典。

选项名称不是很清楚。它包括一些额外的模式。

此外,您可能需要使用CGDisplayModeGetPixelWidth()CGDisplayModeGetPixelHeight()来区分后备存储的磅值和像素大小。 (CGDisplayModeGetWidth()CGDisplayModeGetHeight()返回点大小。通过比较这些值,您可以确定是否缩放模式。)