【问题标题】:Change Windows 10 screen refresh rate. 59 if 60, 60 if 59更改 Windows 10 屏幕刷新率。 59 如果 60, 60 如果 59
【发布时间】:2019-06-03 09:47:50
【问题描述】:

如何将 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: 所以我在 Select-Object 中添加了 -ExpandProperty 参数。它现在只输出 60 或 59。但它仍然不会在两者之间交换 :(。

【问题讨论】:

  • 从字面上看,只有一次 Google 搜索从超级用户论坛返回了这个:superuser.com/questions/1184815/…
  • 感谢您的意见。但是我已经尝试了所有这些。它们都需要外部软件或模块才能运行。我对一种更本土的方式更感兴趣。
  • @Heine Kristensen if 60 then 59 if 59 then 60。为什么你想要这个特定的else 声明?
  • @SNR 我想要else 声明,因为如果我两者都做,我总是会以最后一个结尾。例如。 if 59 then 60 然后加上if 60 then 59 输出总是会变成60,无论如何。
  • @Heine Kristensen Ja,但你为什么想要这种逻辑?抱歉,我第一次可能没有说清楚。

标签: powershell batch-file


【解决方案1】:

基于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

【讨论】:

  • 嗯..我确实尝试过这个,但它确实改变了分辨率和刷新率。我刚刚意识到,也许我可以设法结合 wmic 功能来获得刷新率并使其成为“一键刷新率转换器”。谢谢。
  • 好吧,所以我成功了 50%。 $RefreshRate = wmic PATH Win32_videocontroller get currentrefreshrate if ($RefreshRate = 60){ Set-ScreenResolution -Width 2560 -Height 1440 -Frequency 59} else { Set-ScreenResolution -Width 2560 -Height 1440 -Frequency 60} 这将其更改为 59 如果它是 60。但不是相反。我有点怀疑是我的 $RefreshRate 变量提供了额外的“CurrentRefreshRate”输出。
  • 更新了答案(底线:在您的评论中= 应该是-eq
  • 哇哦。我不知道,你可以在一行中执行 if else 语句。非常感谢,这 100% 按预期工作。
猜你喜欢
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多