Как определить собственное разрешение экрана или коэффициент масштабирования дополнительного монитора в Windows 10 - PullRequest
0 голосов
/ 07 февраля 2019

Есть два монитора: вторичный слева от первичного.Разрешения:

Primary:   2560*1440 scaling 100%
Secondary: 1920*1200 scaling 150%

При запуске программы она делает EnumDisplayMonitors, что дает следующие RECT:

Primary:   0,0,2560,1440
Secondary: -1920,0,-640,800

Также я попробовал код:

int width, height;
RECT rect = { -1920, 0, -640, 800 };
SystemParametersInfoA(SPI_SETWORKAREA, 0, &rect, 0);
width = GetSystemMetrics(SM_CXSCREEN);
height = GetSystemMetrics(SM_CYSCREEN);

, ноwidth и height всегда имеют размеры основного монитора.

Как определить собственное разрешение дополнительного монитора 1920*1200 или коэффициент масштабирования 150%?

Это тоже не работает, дает 1280*800:

BOOL CALLBACK EnumMonitorCallback(HMONITOR hMon, HDC hdc, LPRECT rect, LPARAM param)
{
    MONITORINFOEXA mi;
    mi.cbSize = sizeof(mi);
    GetMonitorInfoA(hMon, &mi);
    HDC dc = CreateDCA("DISPLAY", mi.szDevice, NULL, NULL);
    int width = GetDeviceCaps(dc, HORZRES);
    int height = GetDeviceCaps(dc, VERTRES);
    DeleteDC(dc);
    return TRUE;
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Ваше приложение должно указывать высокую осведомленность о разрешении , чтобы ОС не пыталась лгать о разрешениях, пытаясь имитировать унаследованную среду.Затем Перечисление вывода DXGI возвращает вас запрошенных данных.

Вы можете быстро проверить это с помощью инструмента внизу этого сообщения в блоге .У меня есть два монитора с разрешением 3840x2160, первый с масштабированием 175%, а второй с 150%.Обратите внимание на «координаты рабочего стола» и «DPI монитора» в распечатке ниже:

#### Output: \\.\DISPLAY4

 * Desktop Coordinates: (0, 0) - (3840, 2160); 3840 x 2160
 * Attached To Desktop: 1
 * Rotation: DXGI_MODE_ROTATION_IDENTITY
 * Monitor: 0x000100B3
 * Physical Monitors: LG ULTRA HD(DisplayPort) (0x00000000)
 * Bits Per Color: 10
 * Color Space: DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709
 * Primaries, White Point: R { 0.652, 0.335 }, G { 0.305, 0.637 }, B { 0.148, 0.062 }; { 0.313, 0.329 }
 * Luminance: Min 0.500, Max 270.000, Max Full Frame 270.000
 * Hardware Composition Support: DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_FULLSCREEN | DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHED
 * Monitor DPI, MDT_EFFECTIVE_DPI: 168, 168 ; System DPI 168
 * Monitor DPI, MDT_ANGULAR_DPI: 161, 160
 * Monitor DPI, MDT_RAW_DPI: 162, 161

…

#### Output: \\.\DISPLAY5

 * Desktop Coordinates: (3840, 0) - (7680, 2160); 3840 x 2160
 * Attached To Desktop: 1
 * Rotation: DXGI_MODE_ROTATION_IDENTITY
 * Monitor: 0x000200B1
 * Physical Monitors: LG ULTRA HD(DisplayPort) (0x00000000)
 * Bits Per Color: 10
 * Color Space: DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709
 * Primaries, White Point: R { 0.652, 0.335 }, G { 0.305, 0.637 }, B { 0.148, 0.062 }; { 0.313, 0.329 }
 * Luminance: Min 0.500, Max 270.000, Max Full Frame 270.000
 * Hardware Composition Support: DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_FULLSCREEN | DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHED
 * Monitor DPI, MDT_EFFECTIVE_DPI: 144, 144 ; System DPI 168
 * Monitor DPI, MDT_ANGULAR_DPI: 161, 160
 * Monitor DPI, MDT_RAW_DPI: 162, 161
0 голосов
/ 07 февраля 2019

GetSystemMetrics вызовы для SM_CXSCREEN или SM_CYSCREEN вернут разрешение основного дисплея.Чтобы получить разрешение для вторичных мониторов, вам нужно использовать GetDeviceCaps или API для нескольких мониторов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...