如何将 Windows 显示设置刷新率从 59 更改为 60?
我找不到任何有关如何通过 PowerShell 或批处理脚本完成此操作的信息。 我只会在屏幕分辨率上找到任何内容。
我想要完成的是:
If 60 hz then set 59 hz
else (set 60 hz)
但它似乎没有任何本机 cmdlet?
我只尝试搜索任何可能做到这一点的 cmdlet 或其他 wmi 解决方案,但只找到了如何更改显示分辨率。
编辑:
与 mhu 发布的内容和 wmi 相结合,我已经设法获得了一个有点接近功能的解决方案。
$RefreshRate = Get-WmiObject -Class:Win32_videocontroller | Select-Object -ExpandProperty currentrefreshrate
if ($RefreshRate = 60){
Set-ScreenResolution -Width 2560 -Height 1440 -Frequency 59
}
else {
Set-ScreenResolution -Width 2560 -Height 1440 -Frequency 60
}
但是,这仍然无法使其在两种刷新率之间切换。 关于如何从 WmiObject 获取数字有什么想法吗?
编辑2: 因此,我将 -ExpandProperty 参数添加到 Select-Object 中。现在它只输出 60 或 59。但它仍然不能在两者之间交换:(.
基于https://pastebin.com/QQkcveSM(删除分辨率设置):
function Set-ScreenRefreshRate
{
param (
[Parameter(Mandatory=$true)]
[int] $Frequency
)
$pinvokeCode = @"
using System;
using System.Runtime.InteropServices;
namespace Display
{
[StructLayout(LayoutKind.Sequential)]
public struct DEVMODE1
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmDeviceName;
public short dmSpecVersion;
public short dmDriverVersion;
public short dmSize;
public short dmDriverExtra;
public int dmFields;
public short dmOrientation;
public short dmPaperSize;
public short dmPaperLength;
public short dmPaperWidth;
public short dmScale;
public short dmCopies;
public short dmDefaultSource;
public short dmPrintQuality;
public short dmColor;
public short dmDuplex;
public short dmYResolution;
public short dmTTOption;
public short dmCollate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmFormName;
public short dmLogPixels;
public short 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;
};
class User_32
{
[DllImport("user32.dll")]
public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE1 devMode);
[DllImport("user32.dll")]
public static extern int ChangeDisplaySettings(ref DEVMODE1 devMode, int flags);
public const int ENUM_CURRENT_SETTINGS = -1;
public const int CDS_UPDATEREGISTRY = 0x01;
public const int CDS_TEST = 0x02;
public const int DISP_CHANGE_SUCCESSFUL = 0;
public const int DISP_CHANGE_RESTART = 1;
public const int DISP_CHANGE_FAILED = -1;
}
public class PrimaryScreen
{
static public string ChangeRefreshRate(int frequency)
{
DEVMODE1 dm = GetDevMode1();
if (0 != User_32.EnumDisplaySettings(null, User_32.ENUM_CURRENT_SETTINGS, ref dm))
{
dm.dmDisplayFrequency = frequency;
int iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_TEST);
if (iRet == User_32.DISP_CHANGE_FAILED)
{
return "Unable to process your request. Sorry for this inconvenience.";
}
else
{
iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_UPDATEREGISTRY);
switch (iRet)
{
case User_32.DISP_CHANGE_SUCCESSFUL:
{
return "Success";
}
case User_32.DISP_CHANGE_RESTART:
{
return "You need to reboot for the change to happen.\n If you feel any problems after rebooting your machine\nThen try to change resolution in Safe Mode.";
}
default:
{
return "Failed to change the resolution";
}
}
}
}
else
{
return "Failed to change the resolution.";
}
}
private static DEVMODE1 GetDevMode1()
{
DEVMODE1 dm = new DEVMODE1();
dm.dmDeviceName = new String(new char[32]);
dm.dmFormName = new String(new char[32]);
dm.dmSize = (short)Marshal.SizeOf(dm);
return dm;
}
}
}
"@ # don't indend this line
Add-Type $pinvokeCode -ErrorAction SilentlyContinue
[Display.PrimaryScreen]::ChangeRefreshRate($frequency)
}
function Get-ScreenRefreshRate
{
$frequency = Get-WmiObject -Class "Win32_VideoController" | Select-Object -ExpandProperty "CurrentRefreshRate"
return $frequency
}
要在您的情况下调用此函数:
$currentFrequency = Get-ScreenRefreshRate
$newFrequency = if ($currentFrequency -eq 59) { 60 } else { 59 }
Set-ScreenRefreshRate -Frequency $newFrequency
无法对实际帖子发表评论,但在 Pastebin com QQkcveSM 上发布的脚本完全破坏了我的视频,需要在 Windows 11 中恢复系统