2012-12-13 32 views
2

給定CGDirectDisplayID從如何以編程方式確定在OS X上Retina MacBook Pro屏幕的原始像素分辨率?

CGError error = CGGetActiveDisplayList(8, directDisplayIDs, &displayCount); 

的內置屏幕上的Retina MacBook Pro的,我希望用

size_t pixelWidth = CGDisplayPixelsWide(directDisplayID); 
size_t pixelHeight = CGDisplayPixelsHigh(directDisplayID); 

然而,以獲取本機的像素尺寸,這些調用只返回返回當前所選模式的尺寸。如果我改變屏幕分辨率,我會得到不同的值。我一直在尋找回到2880 X 1800的15" RMBP。

如何抓一個的Retina MacBook Pro的屏幕的原生像素尺寸?

回答

0

我會去不同的路線,而是找出的屏幕尺寸,我將獲取正在運行程序的設備型號,然後將型號與其屏幕的尺寸進行比較。編程型號和相應的屏幕尺寸可能很繁瑣,但這是唯一的方法,我可以

+0

我不確定我想要管理屏幕模型列表,但它是一個選項,謝謝。 –

+0

是否有其他人已整理過屏幕模型和分辨率列表? –

0

如果使用NSScreen是一個選項,你可以在OSX 10.7中做這樣的事情:

NSRect framePixels = [screen convertRectToBacking:[screen frame]]; 

其中framePixels.size是你的顯示器的像素分辨率和screen是指向NSScreen。例如,該代碼將打印所有活動顯示的像素分辨率安慰:

for (NSScreen* screen in [NSScreen screens]) 
{ 
    NSRect framePixels = [screen convertRectToBacking:[screen frame]]; 
    NSLog(@"framePixels: (%f, %f)", framePixels.size.width, framePixels.size.height); 
} 
+1

不幸的是,這也不起作用。它只返回用於當前顯示模式的後備存儲的像素尺寸。不是物理顯示器的原生像素尺寸。如果模式改變,則返回不同的尺寸。例如,在15「Retina顯示屏,在Retina(1440x900 2x)模式下,這會返回'framePixels:(2880.000000,1800.000000)',但是,將模式更改爲最大的」更多空間「(1920x1200 2x),並返回framePixels :(3840.000000,2400.000000)'。 –

+0

唯一的一點是 - 這實際上是正確的。這是屏幕運行的分辨率!用戶有意設置分辨率爲該尺寸。 –

0

我認爲最好的辦法是枚舉所有的顯示模式(包括1倍模式),並發現最大的1x模式的維度。

您可以使用CGDisplayCopyAllDisplayModes()並將密鑰kCGDisplayShowDuplicateLowResolutionModes作爲options映射到kCFBooleanTrue以獲取所有模式。您可以測試CGDisplayModeGetPixelWidth()等於CGDisplayModeGetWidth()以確定哪些是1x。