powershell - 更改 Windows 10 屏幕刷新率。 60 则 59,59 则 60

标签 powershell batch-file

如何将 Windows 显示设置刷新率从 59 更改为 60?

我找不到任何有关如何通过 PowerShell 或批处理脚本完成此操作的信息。 我只会在屏幕分辨率上找到任何内容。

我想要完成的是:

If 60 hz then set 59 hz
        else (set 60 hz)

但它似乎没有任何 native 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

关于powershell - 更改 Windows 10 屏幕刷新率。 60 则 59,59 则 60,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56424817/

相关文章:

Windows 批处理文件 : how to compare command line argument to an integer

java - Procrun 找不到服务的注册表项

string - 如何将 cmdlet 插入到 powershell 中的字符串中

windows - LogonSessionId 帐户在新证书中分配了读取权限?

powershell - 如何根据 select-string -pattern 制作 powershell 脚本横向 zip 文件和报告

vba - 如何使用命令提示符列出目录中的文件名但排除第一个 3 个字符

powershell - 用-ErrorVariable填充变量

powershell - 从Powershell变量中删除字符串

javascript - NodeJS 与 Child_Process - 如何转义我的命令

batch-file - 如何在VBS Shell命令参数中转义等号=