Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
windows 10确定是否;保持纵横比”;设置在PCs GPU上_Windows_Powershell_Registry - Fatal编程技术网

windows 10确定是否;保持纵横比”;设置在PCs GPU上

windows 10确定是否;保持纵横比”;设置在PCs GPU上,windows,powershell,registry,Windows,Powershell,Registry,我试图通过编程确定视频卡是否设置为“保持纵横比”。我在windows中找到了这个注册表项 HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\\00\00 缩放= 4=保持纵横比3=缩放全屏2=中心图像 这很好,但“保持显示比例”似乎将保留该键之前设置的值 是否有人有其他位置或其他方法来确认视频卡设置为保持纵横比?(不使用卡片GUI) 我应该澄清这不是关于DPI设置,这是关

我试图通过编程确定视频卡是否设置为“保持纵横比”。我在windows中找到了这个注册表项

HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\\00\00 缩放=

  • 4=保持纵横比3=缩放全屏2=中心图像
这很好,但“保持显示比例”似乎将保留该键之前设置的值

是否有人有其他位置或其他方法来确认视频卡设置为保持纵横比?(不使用卡片GUI)

我应该澄清这不是关于DPI设置,这是关于正在显示的视频的纵横比

将此作为答案发布(即使不是),因为我需要留出空间来展示我迄今为止所做的工作——以防它有助于任何人找到答案。我目前正在浏览其他Windows API库,试图找到答案

@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

根据EnumDisplaySettings的MSDN文档:

EnumDisplaySettings函数为以下五种设置值 DEVMODE成员:

dmBitsPerPel
dmPelsWidth
dmPelsHeight
dmDisplayFlags
dmDisplayFrequency
我最初关注的“dmScale”似乎是特定于打印机的——如中所示,只有填充DEVMODE结构的打印机函数才会填充该字段

更新2:

它显示GraphicsDrivers键下的所有内容都由为该监视器加载的图形驱动程序更新。非常直观。我能找到的每一篇文章都讨论了如何更改与驱动程序交互的特定于供应商的UI中的值,或者使用图形驱动程序下的适当监视器键与此功能交互

必须有一些Windows图形驱动程序文档讨论每个驱动程序更新/遵守这些值。现在就来确认一下

更新3:

更新源代码以包含pinvoke.net中的DEVMODE结构签名。另外,我相信我在Windows驱动程序文档中找到了冒烟的枪:

缩放取决于用于缩放的源模式和目标模式 路径此外,调用方可以调用SetDisplayConfig,而无需 指定目标模式信息(即,设置 modeInfoArray参数是可选的,可以设置为NULL)。 因此,调用方通常无法预测SetDisplayConfig 必须执行任何缩放此外,不存在获取完整数据的API 图形适配器支持的缩放类型列表。这个 EnumDisplaySettings Win32函数(在Windows SDK中介绍 文档)在dmDisplayFixedOutput中返回DMDFO_默认值 lpDevMode参数指向的DEVMODE结构的成员 当调用方请求新的Windows 7缩放类型时。

调用者传递给SetDisplayConfig的缩放是一种缩放 意图,而不是执行缩放操作的明确请求。 如果需要缩放(例如,源和目标分辨率 不同),SetDisplayConfig使用调用者提供的缩放。 如果不支持提供的缩放,SetDisplayConfig将使用 图形适配器的默认缩放。当源和目标 调用者传递给SetDisplayConfig的分辨率相同, SetDisplayConfig始终设置标识缩放

…我大胆的强调。根据头文件,DMDFO_默认值为0

资料来源:


甚至不确定这是否是GPU。当我使用VLC播放视频时,VLC知道纵横比是否锁定,而不是我的GPU。我可以在两个不同的VLC窗口中设置两个不同的视频,一个有维护,另一个没有。如果我查询注册表,它怎么知道我要找的是哪一个视频?在大多数现代图形卡的GUI中都有设置功能,例如,英特尔集成卡将启动集成图形设置>常规设置>缩放>设置中心图像或保持纵横比。如果不是注册表,我对任何脚本选项都持开放态度。你说这些缩放选项实际上存在于图形驱动程序中是正确的。我在笔记本电脑的英特尔高清图形控制面板上进行了验证。在这一点上,它很可能是一个注册表设置。我很想看看你得到了什么样的答案。我找到了这个脚本,它修改了user32.dll,默认情况下设置它来保持我想要的纵横比。我还没有决定这是答案,但这是一个有趣的途径。我一直说修改,但我想更准确的说法是调用user32.dll?