Public/Display.ps1
<#
.SYNOPSIS Returns [System.Windows.Forms.Screen]::AllScreens .DESCRIPTION Returns [System.Windows.Forms.Screen]::AllScreens .LINK https://osd.osdeploy.com/module/functions/display/get-displayallscreens .NOTES 21.2.1 Initial Release #> function Get-DisplayAllScreens { [CmdletBinding()] param () Add-Type -Assembly System.Windows.Forms Return ([System.Windows.Forms.Screen]::AllScreens | Select-Object * | Sort-Object DeviceName) } <# .SYNOPSIS Calulates the Bitmap Screen Size (PrimaryMonitorSize x ScreenScaling) .DESCRIPTION Calulates the Bitmap Screen Size (PrimaryMonitorSize x ScreenScaling) .LINK https://osd.osdeploy.com/module/functions/display/get-displayprimarybitmapsize .NOTES 21.2.1 Initial Release #> function Get-DisplayPrimaryBitmapSize { [CmdletBinding()] param () $GetDisplayPrimaryMonitorSize = Get-DisplayPrimaryMonitorSize $GetDisplayPrimaryScaling = Get-DisplayPrimaryScaling foreach ($Item in $GetDisplayPrimaryMonitorSize) { [int32]$Item.Width = [math]::round($(($Item.Width * $GetDisplayPrimaryScaling) / 100), 0) [int32]$Item.Height = [math]::round($(($Item.Height * $GetDisplayPrimaryScaling) / 100), 0) } Return $GetDisplayPrimaryMonitorSize } <# .SYNOPSIS Returns [System.Windows.Forms.SystemInformation]::PrimaryMonitorSize .DESCRIPTION Returns [System.Windows.Forms.SystemInformation]::PrimaryMonitorSize .LINK https://osd.osdeploy.com/module/functions/display/get-displayprimarymonitorsize .NOTES 21.2.1 Initial Release #> function Get-DisplayPrimaryMonitorSize { [CmdletBinding()] param () Add-Type -Assembly System.Windows.Forms Return ([System.Windows.Forms.SystemInformation]::PrimaryMonitorSize | Select-Object Width, Height) } <# .SYNOPSIS Returns the Primary Screen Scaling in Percent .DESCRIPTION Returns the Primary Screen Scaling in Percent .LINK https://osd.osdeploy.com/module/functions/display/get-displayPrimaryScaling .NOTES 21.2.1 Initial Release #> function Get-DisplayPrimaryScaling { [CmdletBinding()] param () #Add-Type -Assembly System.Drawing # Get DPI Scaling #[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") Add-Type @' using System; using System.Runtime.InteropServices; using System.Drawing; public class DPI { [DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); public enum DeviceCap { VERTRES = 10, DESKTOPVERTRES = 117 } public static float scaling() { Graphics g = Graphics.FromHwnd(IntPtr.Zero); IntPtr desktop = g.GetHdc(); int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); return (float)PhysicalScreenHeight / (float)LogicalScreenHeight; } } '@ -ReferencedAssemblies 'System.Drawing.dll' -ErrorAction Stop Return [DPI]::scaling() * 100 } <# .SYNOPSIS Returns [System.Windows.Forms.SystemInformation]::VirtualScreen which is a combination of all screens and placement .DESCRIPTION Returns [System.Windows.Forms.SystemInformation]::VirtualScreen which is a combination of all screens and placement .LINK https://osd.osdeploy.com/module/functions/display/get-displayvirtualscreen .NOTES 21.2.1 Initial Release #> function Get-DisplayVirtualScreen { [CmdletBinding()] param () Add-Type -Assembly System.Windows.Forms Return ([System.Windows.Forms.SystemInformation]::VirtualScreen | Select-Object Width, Height, X, Y, Left, Top, Right, Bottom, Size) } <# .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" } } |