CGDisplayCopyAllDisplayModes 遗漏了一种有效模式
CGDisplayCopyAllDisplayModes leaves out one valid mode
当以编程方式使用 OS X (documentation) 中的显示模式时,我发现 CGDisplayCopyAllDisplayModes
遗漏了系统偏好设置中最右边的选项。
A simple utility 打印当前显示模式的大小和所有可用的显示模式大小输出这个
current size: 1920x1200
available sizes:
2880x1800
1440x900
2560x1600
2048x1280
1024x768
800x600
640x480
1680x1050
1280x800
1920x1200
是一个有效选项
系统偏好设置提供的所有其他选项都显示在列表中。有谁知道为什么 1920x1200
可能不包括在内?我尝试更改为系统首选项中的另一个预定义值,但它并没有导致包含 1920x1200
。
编辑(接受的答案比这些恶作剧好得多,但我留下这个信息以防万一)
可以通过引用私有 API.
找到“缩放”显示模式
您可以创建一个使私有方法可用的头文件:参见 this gist that I borrowed from 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")
}
public API 仅记录在 header 中。 CGDisplayCopyAllDisplayModes()
接受一个 options
参数,它是一个字典。文档(甚至 headers)说它未被使用,你必须传递 NULL
,但你可以传递带有键 kCGDisplayShowDuplicateLowResolutionModes
和值 kCFBooleanTrue
的字典。
选项名称不是很清楚。它包括一堆额外的模式。
此外,您可能需要使用 CGDisplayModeGetPixelWidth()
和 CGDisplayModeGetPixelHeight()
来区分后备存储的点大小和像素大小。 (CGDisplayModeGetWidth()
和 CGDisplayModeGetHeight()
return 磅值。通过比较这些值,您可以确定模式是否已缩放。)
当以编程方式使用 OS X (documentation) 中的显示模式时,我发现 CGDisplayCopyAllDisplayModes
遗漏了系统偏好设置中最右边的选项。
A simple utility 打印当前显示模式的大小和所有可用的显示模式大小输出这个
current size: 1920x1200
available sizes:
2880x1800
1440x900
2560x1600
2048x1280
1024x768
800x600
640x480
1680x1050
1280x800
1920x1200
是一个有效选项
系统偏好设置提供的所有其他选项都显示在列表中。有谁知道为什么 1920x1200
可能不包括在内?我尝试更改为系统首选项中的另一个预定义值,但它并没有导致包含 1920x1200
。
编辑(接受的答案比这些恶作剧好得多,但我留下这个信息以防万一)
可以通过引用私有 API.
找到“缩放”显示模式您可以创建一个使私有方法可用的头文件:参见 this gist that I borrowed from 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")
}
public API 仅记录在 header 中。 CGDisplayCopyAllDisplayModes()
接受一个 options
参数,它是一个字典。文档(甚至 headers)说它未被使用,你必须传递 NULL
,但你可以传递带有键 kCGDisplayShowDuplicateLowResolutionModes
和值 kCFBooleanTrue
的字典。
选项名称不是很清楚。它包括一堆额外的模式。
此外,您可能需要使用 CGDisplayModeGetPixelWidth()
和 CGDisplayModeGetPixelHeight()
来区分后备存储的点大小和像素大小。 (CGDisplayModeGetWidth()
和 CGDisplayModeGetHeight()
return 磅值。通过比较这些值,您可以确定模式是否已缩放。)