3

I was asked by a client's IT admin to "write a powershell script that sets the resolution manually on bootup". Presumably it is possible if they're asking me to do this. I have absolutely no experience with powershell. My scripts/commands and their errors are as follows:

Set-DisplayResolution -Width 1024 -Height 768

Set-DisplayResolution is not recognized as the name of a cmdlet, function, script file, or operable program.

Set-ScreenResolution -Width 1024 -Height 768

Set-ScreenResolution is not recognized as the name of a cmdlet, function, script file, or operable program.

SetDisplayResolution -Width 1024 -Height 768

SetDisplayResolution is not recognized as the name of a cmdlet, function, script file, or operable program.

What am I missing? Thank you.

enter image description here

3
  • 3
    Please don’t include answers in questions.  Post your answer as an answer and edit it out of the question. Jan 24 '20 at 4:33
  • 1
    Set-DisplayResolution is a commandlet from the ServerCore PowerShell module and seems not to be available on Windows 10.
    – CodeFox
    Dec 8 '20 at 17:25
  • 1
    Can confirm what @CodeFox said. Running Set-DisplayResolution -Width 1024 -Height 768 on Windows Server 2019 worked out of the box.
    – Jaakko
    Jan 3 at 9:21
4

Not sure where you got your example from but in a native powershell there is no command to set the resolution.

I use AutoHotKey. You can build your own script there or use an example from the net.

Or you could write your own function, that can be called from powershell: see here

And of course there are several 3rd party tools depending on your requirements. Here's one example that works with a script as well or here are 7 others. What exactly are you trying to do?

6
  • I'm trying to have the resolution set automatically when the machine boots (I realize the resolution should persist through a power cycle and/or is hardware-dependent, but just accept this as presupposition for the given scenario).
    – A__
    Oct 17 '19 at 18:05
  • @A__ how many screens?
    – Albin
    Oct 17 '19 at 18:06
  • How would that powershell function you linked be organized? Would I put that inside a ps1 script, followed by the actual call to it (Set-ScreenResolution -Width 1024 -Height 768) inside the script as well?
    – A__
    Oct 17 '19 at 18:07
  • one 4k display ////
    – A__
    Oct 17 '19 at 18:07
  • 1
    @A__ as shown in the paramter definition param() would have guessed Set-ScreenResolution 1024 768 but I'm propable wrong since the script says in it's example it should be Set-ScreenResolution -Width 1024 -Height 768. Haven't used my own function in powershell for quite a while, I'm propable mistaken, just in case: try both! ;)
    – Albin
    Oct 17 '19 at 18:20
1

Per Albin's answer:

Make a setResolution.ps1 file with the following contents (src):

Function Set-ScreenResolution { 

<# 
    .Synopsis 
        Sets the Screen Resolution of the primary monitor 
    .Description 
        Uses Pinvoke and ChangeDisplaySettings Win32API to make the change 
    .Example 
        Set-ScreenResolution -Width 1024 -Height 768         
    #> 
param ( 
[Parameter(Mandatory=$true, 
           Position = 0)] 
[int] 
$Width, 

[Parameter(Mandatory=$true, 
           Position = 1)] 
[int] 
$Height 
) 

$pinvokeCode = @" 

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 "Success"; 
                            } 
                        case User_32.DISP_CHANGE_RESTART: 
                            { 
                                return "You Need To Reboot For The Change To Happen.\n If You Feel Any Problem 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; 
        } 
    } 
} 

"@ 

Add-Type $pinvokeCode -ErrorAction SilentlyContinue 
[Resolution.PrmaryScreenResolution]::ChangeResolution($width,$height) 
} 

Set-ScreenResolution -Width 1024 -Height 768

Then the file can be executed from powershell as follows

`C:\path-to-file\setResolution.ps1`

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.