Public/Functions/Display/Set-DisRes.ps1
<#
.SYNOPSIS Sets the Primary Display Screen Resolution .DESCRIPTION Sets the Primary Display Screen Resolution .LINK https://osd.osdeploy.com/module/functions/display/set-disres .NOTES 21.2.1 Initial Release #> function Set-DisRes { [CmdletBinding()] param ( [Parameter(Position = 0)] [Alias('Horizontal')] [string]$Width, [Parameter(Position = 1)] [Alias('Vertical')] [string]$Height ) $Code = @" using System; using System.Runtime.InteropServices; namespace Resolution { [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 PrmaryScreenResolution { static public string ChangeResolution(int width, int height) { DEVMODE1 dm = GetDevMode1(); if (0 != User_32.EnumDisplaySettings(null, User_32.ENUM_CURRENT_SETTINGS, ref dm)) { dm.dmPelsWidth = width; dm.dmPelsHeight = height; 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 "DisRes successfully changed the Display Resolution"; } case User_32.DISP_CHANGE_RESTART: { return "DisRes needs to restart to change the Display Resolution"; } default: { return "DisRes failed to change the Display 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; } } } "@ Add-Type $Code -ErrorAction SilentlyContinue #Check if we need to Restore the previous settings if ($Width -eq 'Restore') { if ($null -eq $Global:SetDisRes) { Write-Warning "Unable to Restore previous Display Settings" Break } else { $Width = $Global:SetDisRes.Width; $Height = $Global:SetDisRes.Height; } } else { #Set a Restore only for this PowerShell session $Global:SetDisRes = Get-DisplayPrimaryBitmapSize } if ($Width -and $Height) { #Do Nothing } elseif ($Width) { if ($Width -eq '720p') {[int]$Width = 1280;[int]$Height = 720} if ($Width -eq '1080p') {[int]$Width = 1920;$Height = 1080} if ($Width -eq '4k') {[int]$Width = 3840;$Height = 2160} if ($Width -eq 1280) {$Height = 600} #2.13333333333333 if ($Width -eq 1280) {$Height = 768} #1.66666666666667 if ($Width -eq 1280) {$Height = 800} #1.6 if ($Width -eq 1280) {$Height = 1024} #1.25 if ($Width -eq 1360) {$Height = 768} #1.77083333333333 if ($Width -eq 1366) {$Height = 768} #1.77864583333333 if ($Width -eq 1440) {$Height = 900} #1.6 if ($Width -eq 1680) {$Height = 1050} #1.6 if ($Width -eq 1920) {$Height = 1200} #1.6 if ($Width -eq 2560) {$Height = 1600} #1.6 if ($Width -eq 2560) {$Height = 2048} #1.25 if ($Width -eq 5120) {$Height = 1440} #3.55555555555555 #4:3 if ($Width -eq 800) {$Height = 600} #4:3 if ($Width -eq 1024) {$Height = 768} #4:3 if ($Width -eq 1152) {$Height = 864} #4:3 if ($Width -eq 1280) {$Height = 960} #4:3 if ($Width -eq 1400) {$Height = 1050} #4:3 if ($Width -eq 1600) {$Height = 1200} #4:3 if ($Width -eq 1792) {$Height = 1344} #4:3 if ($Width -eq 1856) {$Height = 1392} #4:3 if ($Width -eq 1920) {$Height = 1440} #4:3 if ($Width -eq 2048) {$Height = 1536} #4:3 if ($Width -eq 2560) {$Height = 1920} #4:3 #16:9 if ($Width -eq 1280) {$Height = 720} #16:9 if ($Width -eq 1600) {$Height = 900} #16:9 if ($Width -eq 1920) {$Height = 1080} #16:9 if ($Width -eq 2048) {$Height = 1152} #16:9 if ($Width -eq 3840) {$Height = 2160} #16:9 Write-Verbose "Height (Vertical Resolution) was automatically set to $Height" } elseif ($Height) { Write-Warning "Height (Vertical Resolution) was not set" Break } else { #Set Defauts [int]$Width = 1920 [int]$Height = 1080 } [int]$IntWidth = $Width [int]$IntHeight = $Height Write-Verbose "Width: $IntWidth" Write-Verbose "Height: $IntHeight" $Result = [Resolution.PrmaryScreenResolution]::ChangeResolution([int]$IntWidth,[int]$IntHeight) if ($Result -eq 'DisRes successfully changed the Display Resolution') { #Do Nothing } else { Write-Warning "$Result" } } |