diff --git a/base.win/profile.d/ScreenRefreshRate.ps1 b/base.win/profile.d/ScreenRefreshRate.ps1 new file mode 100644 index 0000000..f6d179e --- /dev/null +++ b/base.win/profile.d/ScreenRefreshRate.ps1 @@ -0,0 +1,132 @@ +function Set-ScreenRefreshRate +{ +param ( + [Parameter(Mandatory=$true)] + [int] $Frequency +) + + $local: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) +} \ No newline at end of file