windows 10 определяет, установлен ли «поддерживать пропорции» на GPU ПК - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь программно определить, установлена ​​ли видеокарта для «поддержания соотношения сторон». Я отследил этот ключ реестра в windows.

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ GraphicsDrivers \ Configuration \\ 00 \ 00 масштабирование =

  • 4 = поддерживать соотношение сторон 3 = масштабировать полный экран 2 = центральное изображение

Это было бы здорово, но, похоже, что «поддерживать масштабирование дисплея» сохранит все, что было задано ранее этой клавишей.

У кого-нибудь есть другое местоположение или другой способ подтвердить, что видеокарта настроена на поддержание соотношения сторон? (без использования карт GUI)

Я должен пояснить, что речь идет не о настройках DPI, а о соотношении сторон отображаемого видео.

1 Ответ

0 голосов
/ 19 февраля 2020

Опубликовать это как ответ (хотя это не так), так как мне нужно пробел, чтобы показать, что я сделал до сих пор - на случай, если это поможет кому-нибудь к ответу. В настоящее время я просматриваю другие библиотеки API Windows, чтобы попытаться найти ответ.

@ MinerBob, я вчера видел код этого парня, но не смог заставить его работать, поэтому я изменил несколько вещей и Теперь я представляю данные как можно точнее, но, просматривая структуру, она не содержит информацию, к которой вы стремитесь, но вот как вы можете сгенерировать вывод, чтобы просмотреть его самостоятельно:

Add-Type "
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Forms;

[StructLayout(LayoutKind.Sequential)]
public struct DEVMODE
{
    private const int CCHDEVICENAME = 0x20;
    private const int CCHFORMNAME = 0x20;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
    public string dmDeviceName;
    public short dmSpecVersion;
    public short dmDriverVersion;
    public short dmSize;
    public short dmDriverExtra;
    public int dmFields;
    public int dmPositionX;
    public int dmPositionY;
    public ScreenOrientation dmDisplayOrientation;
    public int dmDisplayFixedOutput;
    public short dmColor;
    public short dmDuplex;
    public short dmYResolution;
    public short dmTTOption;
    public short dmCollate;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
    public string dmFormName;
    public short dmLogPixels;
    public int dmBitsPerPel;
    public int dmPelsWidth;
    public int dmPelsHeight;
    public int dmDisplayFlags;
    public int dmDisplayFrequency;
    public int dmICMMethod;
    public int dmICMIntent;
    public int dmMediaType;
    public int dmDitherType;
    public int dmReserved1;
    public int dmReserved2;
    public int dmPanningWidth;
    public int dmPanningHeight;
}

public static class user32
{

    [DllImport(`"user32.dll`")]
    public static extern bool EnumDisplaySettings(string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode);

    public const int ENUM_CURRENT_SETTINGS = -1;
    public const int ENUM_REGISTRY_SETTINGS = -2;

    public static void GetDisplaySettings()
    {  
        DEVMODE vDevMode = new DEVMODE();

        if (EnumDisplaySettings(null, ENUM_CURRENT_SETTINGS, ref vDevMode)) 
        {
        Console.WriteLine(@`"
            dmDeviceName = {0} 
            dmSpecVersion = {1} 
            dmDriverVersion = {2} 
            dmSize = {3} 
            dmDriverExtra = {4} 
            dmFields = {5} 
            dmPositionX = {6} 
            dmPositionY = {7} 
            dmDisplayOrientation = {8} 
            dmDisplayFixedOutput = {9} 
            dmColor = {10} 
            dmDuplex = {11} 
            dmYResolution = {12} 
            dmTTOption = {13} 
            dmCollate = {14} 
            dmFormName = {15} 
            dmLogPixels = {16} 
            dmBitsPerPel = {17} 
            dmPelsWidth = {18} 
            dmPelsHeight = {19} 
            dmDisplayFlags = {20} 
            dmDisplayFrequency = {21} 
            dmICMMethod = {22} 
            dmICMIntent = {23} 
            dmMediaType = {24} 
            dmDitherType = {25} 
            dmReserved1 = {26} 
            dmReserved2 = {27} 
            dmPanningWidth = {28} 
            dmPanningHeight = {29}
        `",
            vDevMode.dmDeviceName, 
            vDevMode.dmSpecVersion, 
            vDevMode.dmDriverVersion, 
            vDevMode.dmSize, 
            vDevMode.dmDriverExtra, 
            vDevMode.dmFields, 
            vDevMode.dmPositionX, 
            vDevMode.dmPositionY, 
            vDevMode.dmDisplayOrientation, 
            vDevMode.dmDisplayFixedOutput, 
            vDevMode.dmColor, 
            vDevMode.dmDuplex, 
            vDevMode.dmYResolution, 
            vDevMode.dmTTOption, 
            vDevMode.dmCollate, 
            vDevMode.dmFormName, 
            vDevMode.dmLogPixels, 
            vDevMode.dmBitsPerPel, 
            vDevMode.dmPelsWidth, 
            vDevMode.dmPelsHeight, 
            vDevMode.dmDisplayFlags, 
            vDevMode.dmDisplayFrequency, 
            vDevMode.dmICMMethod, 
            vDevMode.dmICMIntent, 
            vDevMode.dmMediaType, 
            vDevMode.dmDitherType, 
            vDevMode.dmReserved1, 
            vDevMode.dmReserved2, 
            vDevMode.dmPanningWidth, 
            vDevMode.dmPanningHeight
        );
        }
    }
}
" -ReferencedAssemblies System.Windows.Forms

[user32]::GetDisplaySettings()

ОБНОВЛЕНИЕ 1 :

В соответствии с документацией MSDN для EnumDisplaySettings:

Функция EnumDisplaySettings устанавливает значения для следующих пяти членов DEVMODE:

dmBitsPerPel
dmPelsWidth
dmPelsHeight
dmDisplayFlags
dmDisplayFrequency

то, что я изначально фокусировал на 'dmScale', похоже, указано для c для принтеров - как, например, только функции принтера, которые заполняют структуру DEVMODE, заполнят это поле.

Обновление 2:

Похоже, все под ключом GraphicsDrivers обновляется драйвером графики, который загружен для этого монитора. Очень Интуитивно. В каждой статье, которую я мог найти, говорится об изменении значения в пользовательском интерфейсе c, определяемом поставщиком, который взаимодействует с его драйвером, или использовании соответствующей клавиши монитора в разделе Драйверы графики для взаимодействия с этой функцией.

Должно быть какое-то Windows Документация по графическим драйверам, в которой говорится о каждом обновлении / соблюдении этих значений каждым драйвером. Ищите это сейчас для подтверждения.

Обновление 3:

Обновлен источник, включающий сигнатуру структуры DEVMODE из pinvoke. net. Кроме того, я думаю, что я нашел пистолет для курения в документации Windows драйвера:

Масштабирование зависит от исходного и целевого режимов, которые используются для пути. Кроме того, вызывающая сторона может вызывать SetDisplayConfig без указания информации о целевом режиме (то есть установка параметра modeInfoArray является необязательной и может иметь значение NULL). Поэтому вызывающая сторона обычно не может предсказать, должно ли SetDisplayConfig выполнять какое-либо масштабирование. Кроме того, не существует API для получения полного списка типов масштабирования, поддерживаемых графическим адаптером. Функция EnumDisplaySettings Win32 (описанная в документации Windows SDK) возвращает DMDFO_DEFAULT в элементе dmDisplayFixedOutput структуры DEVMODE, на который указывает параметр lpDevMode, когда вызывающая сторона запрашивает новые Windows 7 типы масштабирования.

Масштабирование, которое вызывающая сторона передает SetDisplayConfig, является намерением масштабирования, а не явным запросом на выполнение операции масштабирования. Если требуется масштабирование (например, исходное и целевое разрешения различаются), SetDisplayConfig использует масштабирование, предоставляемое вызывающей стороной. Если предоставленное масштабирование не поддерживается, SetDisplayConfig использует масштабирование по умолчанию для графического адаптера. Когда исходное и целевое разрешения, которые вызывающий абонент передает SetDisplayConfig, совпадают, SetDisplayConfig всегда устанавливает идентификационное масштабирование.

... мой выделенный жирным шрифтом акцент. DMDFO_DEFAULT, согласно заголовочному файлу, равен 0.

Источники:

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