Я ищу способ получения двух частей информации: (1) полное физическое разрешение дисплея, даже если это экран Retina;(2) разрешение, которое операционная система, в соответствии с текущими настройками системы, притворяется на том же экране.Пока я могу получить (2), но не могу (1).Похоже, что я сталкиваюсь с комментарием здесь о том, что
Существует еще больше беспорядка, если кто-то установит «Масштабируемое» разрешение в системных настройках macOS-> Дисплеи
, не имея возможности найти какую-либо информацию о том, как ориентироваться в этом "беспорядке".Пока у меня есть следующее, которое я компилирую с clang -framework Cocoa -x objective-c -o grokResolution
:
#import <AppKit/AppKit.h>
void ReportRect(CGRect rect, const char *description)
{
printf("{'x': % 5g, 'y':% 5g, 'width':% 5g, 'height':% 5g, 'name':'%s'}\n",
rect.origin.x, rect.origin.y,
rect.size.width, rect.size.height,
description);
}
int main(int argc, char** argv)
{
NSScreen *screen = [[NSScreen screens] objectAtIndex:0];
CGRect looksLike = [screen frame];
CGRect backing = [screen convertRectToBacking:looksLike];
ReportRect(looksLike, "looksLike");
ReportRect(backing, "backing");
printf("{'backingScaleFactor' : %0.2f}\n", [screen backingScaleFactor]);
}
Мой экран Retina имеет 2560x1600 физических пикселей.Если я использую настройку масштабирования по умолчанию, которую приложение «Системные настройки» предварительно просматривает с «Похоже на 1280 x 800», то программа выдаст следующее:
{'x': 0, 'y': 0, 'width': 1280, 'height': 800, 'name':'looksLike'}
{'x': 0, 'y': 0, 'width': 2560, 'height': 1600, 'name':'backing'}
{'backingScaleFactor' : 2.00}
Так что это кажется правильным.Однако, если я щелкну на следующем параметре масштабирования справа в Системных настройках, а затем перезапущу программу, я получу:
{'x': 0, 'y': 0, 'width': 1440, 'height': 900, 'name':'looksLike'}
{'x': 0, 'y': 0, 'width': 2880, 'height': 1800, 'name':'backing'}
{'backingScaleFactor' : 2.00}
Теперь, в то время как настройка «Похоже» системных настроек выглядит какПри правильном отражении в выводе [screen frame]
мое понимание всей системы явно ошибочно, потому что я ожидал, что backingScaleFactor
и / или convertRectToBacking
будут правильно преобразовывать из поддельного в реальное физическое разрешение.Кажется, backingScaleFactor
не корректно корректируется при изменении системных настроек - в этом случае преобразование возвращает больше пикселей, чем на самом деле имеет мое оборудование.
Как правильно преобразовать?Или есть еще один более прямой способ запроса фактического количества физических пикселей, которое имеет дисплей?
(я знаю о system_profiler SPDisplaysDataType | grep Resolution
, но мне нужно решение, которое будет работать в рамках существующего исходного кода obj-C.)