首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >更改Windows 10屏幕刷新率。如果是60,则是59;如果是59,则是60

更改Windows 10屏幕刷新率。如果是60,则是59;如果是59,则是60
EN

Stack Overflow用户
提问于 2019-06-03 17:47:50
回答 1查看 2.7K关注 0票数 0

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

我找不到任何关于如何通过PowerShell或批处理脚本来完成此任务的内容。我只会在屏幕分辨率上找到任何东西。

我想要实现的是:

代码语言:javascript
复制
If 60 hz then set 59 hz
        else (set 60 hz)

但它似乎没有任何本机cmdlet?

我只尝试搜索任何可能做到这一点的cmdlet或其他wmi解决方案,但只找到了如何更改显示分辨率。

编辑:

结合mhu发布的内容和wmi,我已经设法获得了一个有点接近正常运行的解决方案。

代码语言:javascript
复制
$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获取数字,有什么想法吗?

EDIT2:所以我在Select-Object中添加了-ExpandProperty参数。它现在只输出60或59。但它仍然不能在这两者之间进行交换:(.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-03 19:27:06

基于https://pastebin.com/QQkcveSM (删除的分辨率设置):

代码语言:javascript
复制
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
}

要在您的示例中调用此函数:

代码语言:javascript
复制
$currentFrequency = Get-ScreenRefreshRate
$newFrequency     = if ($currentFrequency -eq 59) { 60 } else { 59 }

Set-ScreenRefreshRate -Frequency $newFrequency
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56424817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档