windows 10确定是否;保持纵横比”;设置在PCs GPU上
我试图通过编程确定视频卡是否设置为“保持纵横比”。我在windows中找到了这个注册表项 HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\\00\00 缩放=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设置,这是关
- 4=保持纵横比3=缩放全屏2=中心图像
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
资料来源: