Перечень мониторов DXGI не дает полного размера для монитора Dell P2715Q

Я делаю DXGI адаптеры и отслеживаю нумерацию. Второй монитор, подключенный к моему компьютеру, - Dell P2715Q с разрешением 3840*2160:

разрешение

Тем не менее, программа сообщает это как 2560*1440, второе доступное разрешение. Минимальный код для воспроизведения:

int main()
{
IDXGIFactory1* pFactory1;

HRESULT hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)(&pFactory1));

if (FAILED(hr))
{
    wcout << L"CreateDXGIFactory1 failed. " << endl;
    return 0;
}

for (UINT i = 0;; i++)
{
    IDXGIAdapter1* pAdapter1 = nullptr;

    hr = pFactory1->EnumAdapters1(i, &pAdapter1);

    if (hr == DXGI_ERROR_NOT_FOUND)
    {
        // no more adapters
        break;
    }

    if (FAILED(hr))
    {
        wcout << L"EnumAdapters1 failed. " << endl;
        return 0;
    }

    DXGI_ADAPTER_DESC1 desc;

    hr = pAdapter1->GetDesc1(&desc);

    if (FAILED(hr))
    {
        wcout << L"GetDesc1 failed. " << endl;
        return 0;
    }

    wcout << L"Adapter: " << desc.Description << endl;

    for (UINT j = 0;; j++)
    {
        IDXGIOutput *pOutput = nullptr;

        HRESULT hr = pAdapter1->EnumOutputs(j, &pOutput);

        if (hr == DXGI_ERROR_NOT_FOUND)
        {
            // no more outputs
            break;
        }

        if (FAILED(hr))
        {
            wcout << L"EnumOutputs failed. " << endl;
            return 0;
        }

        DXGI_OUTPUT_DESC desc;

        hr = pOutput->GetDesc(&desc);

        if (FAILED(hr))
        {
            wcout << L"GetDesc1 failed. " << endl;
            return 0;
        }

        wcout << L"  Output: " << desc.DeviceName <<
            L"  (" << desc.DesktopCoordinates.left << L"," << desc.DesktopCoordinates.top << L")-(" <<
            (desc.DesktopCoordinates.right - desc.DesktopCoordinates.left) << L"," << 
            (desc.DesktopCoordinates.bottom - desc.DesktopCoordinates.top) << L")" << endl;

    }
}

return 0;
}

Выход:

Адаптер: Intel(R) Iris(Pro) Pro Graphics 6200 Выход: \\.\DISPLAY1  (0,0)-(1920,1200) Выход: \\.\DISPLAY2  (1920,0)-(2560,1440)

Что может вызвать это поведение: ограничения DirectX, видеопамять, адаптер дисплея, драйвер, монитор?

Среда:

Windows 10 x64
Графика Intel(R) Iris(TM) Pro 6200
DELL P2715Q

2 ответа

Решение

Ваше приложение считается не осведомленным о масштабировании DPI. Операционная система масштабирует координаты, чтобы вы, предположительно, поддерживали совместимость с устаревшими приложениями.

Сообщите системе, что вы знаете о разработке приложений для настольных ПК с высоким разрешением, и вы получите ожидаемые координаты:

#include <ShellScalingAPI.h>

#pragma comment(lib, "shcore.lib")

int main()
{
    SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE);
    // there goes your code
Adapter: Intel(R) HD Graphics 4600
  Output: \\.\DISPLAY4  (0,0)-(3840,2160)
  Output: \\.\DISPLAY5  (3840,0)-(3840,2160)

без SetProcessDpiAwareness:

Adapter: Intel(R) HD Graphics 4600
  Output: \\.\DISPLAY4  (0,0)-(2194,1234)
  Output: \\.\DISPLAY5  (2194,0)-(2194,1234)

Обратите внимание на комментарий структуры DXGI_OUTPUT_DESC на MSDN:

DesktopCoordinates

Тип: RECT

Структура RECT, содержащая границы вывода в координатах рабочего стола. Координаты рабочего стола зависят от количества точек на дюйм (DPI) рабочего стола. Для получения информации о написании приложений Win32 с поддержкой DPI см. High DPI.

В качестве альтернативы римскому ответу, вы можете добавить манифест в свой проект, чтобы он знал dpi.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>
Другие вопросы по тегам