$pinvokeCode = @" using System; using System.Runtime.InteropServices; using System.Collections.Generic;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 int dmPosition_X; public int dmPosition_Y; public int dmDisplayOrientation; public int dmDisplayFixedOutput; 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; }; [Flags()] public enum DisplayDeviceStateFlags : int { /// <summary>The device is part of the desktop.</summary> AttachedToDesktop = 0x1, MultiDriver = 0x2, /// <summary>The device is part of the desktop.</summary> PrimaryDevice = 0x4, /// <summary>Represents a pseudo device used to mirror application drawing for remoting or other purposes.</summary> MirroringDriver = 0x8, /// <summary>The device is VGA compatible.</summary> VGACompatible = 0x10, /// <summary>The device is removable; it cannot be the primary display.</summary> Removable = 0x20, /// <summary>The device has more display modes than its output devices support.</summary> ModesPruned = 0x8000000, Remote = 0x4000000, Disconnect = 0x2000000 } [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] public struct DISPLAY_DEVICE { [MarshalAs(UnmanagedType.U4)] public int cb; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)] public string DeviceName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] public string DeviceString; [MarshalAs(UnmanagedType.U4)] public DisplayDeviceStateFlags StateFlags; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] public string DeviceID; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] public string DeviceKey; } 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); [DllImport("user32.dll")] public static extern int ChangeDisplaySettingsEx(string deviceName, ref DEVMODE1 devMode, IntPtr hwnd, int flags, IntPtr lParam); [DllImport("user32.dll")] public static extern bool EnumDisplayDevices(string lpDevice, uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags); public const int ENUM_CURRENT_SETTINGS = -1; public const int CDS_UPDATEREGISTRY = 0x01; public const int CDS_SET_PRIMARY = 0x10; 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 Displays { public static IList<string> GetDisplayNames() { var returnVals = new List<string>(); for(var x=0U; x<1024; ++x) { DISPLAY_DEVICE outVar = new DISPLAY_DEVICE(); outVar.cb = (short)Marshal.SizeOf(outVar); if(User_32.EnumDisplayDevices(null, x, ref outVar, 1U)) { returnVals.Add(outVar.DeviceName); } } return returnVals; } public static string GetCurrentResolution(string deviceName) { string returnValue = null; DEVMODE1 dm = GetDevMode1(); if (0 != User_32.EnumDisplaySettings(deviceName, User_32.ENUM_CURRENT_SETTINGS, ref dm)) { returnValue = "Width:" + dm.dmPelsWidth + ", height:" + dm.dmPelsHeight + ", PosX:" + dm.dmPosition_X + ", PosY:" + dm.dmPosition_Y; } return returnValue; }
public static IList<string> GetResolutions() { var displays = GetDisplayNames(); var returnValue = new List<string>(); foreach(var display in displays) { returnValue.Add(GetCurrentResolution(display)); } return returnValue; } 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; }
public static string ChangeResolution(string deviceName, int width, int height, int PosX) { string returnValue = null; DEVMODE1 dm = GetDevMode1(); if (0 != User_32.EnumDisplaySettings(deviceName, User_32.ENUM_CURRENT_SETTINGS, ref dm)) { dm.dmPelsWidth = width; dm.dmPelsHeight = height; dm.dmPosition_X = PosX;
returnValue = dm.dmPelsWidth + "," + dm.dmPelsHeight;
int iRet;
if (PosX == 0) { iRet = User_32.ChangeDisplaySettingsEx(deviceName, ref dm, IntPtr.Zero, User_32.CDS_UPDATEREGISTRY, IntPtr.Zero); } else { iRet = User_32.ChangeDisplaySettingsEx(deviceName, ref dm, IntPtr.Zero, User_32.CDS_UPDATEREGISTRY | User_32.CDS_SET_PRIMARY, IntPtr.Zero); } } return returnValue; }
}} "@clear-hostAdd-Type $pinvokeCode
# ****************************************************************************************************************************# SET4k# ****************************************************************************************************************************function Set4K(){ Write-Host -foregroundcolor green -backgroundcolor black "Setting to 4k";
Set-ItemProperty -Path "HKCU:\SOFTWARE\FinalWire\AIDA64" -Name "SensorPanelPosX" -Value 3845.50 Set-ItemProperty -Path "HKCU:\Control Panel\Desktop\PerMonitorSettings\GSM770791464_07_07E2_60^D276A59E75A91546EE3EDA825C559D04" -Name "DpiValue" -Value 2 Set-ItemProperty -Path "HKCU:\Control Panel\Desktop\PerMonitorSettings\SAM1016HCHN803327_21_07E4_CB^381CD8BFD32FE0D5F9A94DB84E74138F" -Name "DpiValue" -Value 2
$retVal = [Resolution.Displays]::ChangeResolution("\\.\DISPLAY2", 3840, 2160, 0);#Display 2 Is Monitor on Left $retVal = [Resolution.Displays]::ChangeResolution("\\.\DISPLAY1", 3840, 2160, 3840);#Display 1 Is Monitor on Right $retVal = [Resolution.Displays]::ChangeResolution("\\.\DISPLAY3", 1920, 480, 7680);
return;}
# ****************************************************************************************************************************# SET1k# ****************************************************************************************************************************function Set1K(){ Write-Host -foregroundcolor red -backgroundcolor black "Setting to 1k";
Set-ItemProperty -Path "HKCU:\SOFTWARE\FinalWire\AIDA64" -Name "SensorPanelPosX" -Value 1920 Set-ItemProperty -Path "HKCU:\Control Panel\Desktop\PerMonitorSettings\GSM770791464_07_07E2_60^D276A59E75A91546EE3EDA825C559D04" -Name "DpiValue" -Value 0 Set-ItemProperty -Path "HKCU:\Control Panel\Desktop\PerMonitorSettings\SAM1016HCHN803327_21_07E4_CB^381CD8BFD32FE0D5F9A94DB84E74138F" -Name "DpiValue" -Value 0
$retVal = [Resolution.Displays]::ChangeResolution("\\.\DISPLAY2", 1920, 1080, 0);#Display 2 is Monitor on Left $retVal = [Resolution.Displays]::ChangeResolution("\\.\DISPLAY1", 1920, 1080, 1920); $retVal = [Resolution.Displays]::ChangeResolution("\\.\DISPLAY3", 1920, 480, 3840);
return;}
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>#REMEMBER TO RESTART POWERSHELL AFTER EACH CHANGE FOR CODE IN PINVOKE!#MAIN EXECUTION BEGINS HERE#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
$displays = [Resolution.Displays]::GetDisplayNames();foreach($displayName in $displays){ $res=[Resolution.Displays]::GetCurrentResolution($displayName); if ($res -eq $null) { continue; }
$displayName; $res;}
Set1K