0

Does someone know a powershell code how to rotate a screen. I already use the $width and the $height parameters but is there also a rotation parameter?

I already searched on the following sites:

I already using this code:

Function Set-ScreenResolution { 
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 1920 1080

Thank you,

1 Answers1

1

It looks like this is possible with the Win32 API (C/C++ libraries). With some inline C# compilation, you can P/Invoke into the Win32 API from Powershell just as you can from other .NET languages.

I've linked above to a Github script I found that changes the screen orientation from Powershell using the aforementioned Win32 API. If you want to know more about P/Invoke itself, here is the official Microsoft Documentation on the subject. For posterity, here is the script as it currently exists:

Function Set-ScreenResolutionAndOrientation { 

<# 
    .Synopsis 
        Sets the Screen Resolution of the primary monitor 
    .Description 
        Uses Pinvoke and ChangeDisplaySettings Win32API to make the change 
    .Example 
        Set-ScreenResolutionAndOrientation         
        
    URL: http://stackoverflow.com/questions/12644786/powershell-script-to-change-screen-orientation?answertab=active#tab-top
    CMD: powershell.exe -ExecutionPolicy Bypass -File "%~dp0ChangeOrientation.ps1"
#>

$pinvokeCode = @" 
using System; 
using System.Runtime.InteropServices; 
namespace Resolution 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct DEVMODE 
    { 
       [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    dmPositionX;
       public int    dmPositionY;
       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;
    }; 
    class NativeMethods 
    { 
        [DllImport("user32.dll")] 
        public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE devMode); 
        [DllImport("user32.dll")] 
        public static extern int ChangeDisplaySettings(ref DEVMODE 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 const int DMDO_DEFAULT = 0;
        public const int DMDO_90 = 1;
        public const int DMDO_180 = 2;
        public const int DMDO_270 = 3;
    } 
    public class PrmaryScreenResolution 
    { 
        static public string ChangeResolution() 
        { 
            DEVMODE dm = GetDevMode(); 
            if (0 != NativeMethods.EnumDisplaySettings(null, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm)) 
            {
                // swap width and height
                int temp = dm.dmPelsHeight;
                dm.dmPelsHeight = dm.dmPelsWidth;
                dm.dmPelsWidth = temp;
                // determine new orientation based on the current orientation
                switch(dm.dmDisplayOrientation)
                {
                    case NativeMethods.DMDO_DEFAULT:
                        //dm.dmDisplayOrientation = NativeMethods.DMDO_270;
                        //2016-10-25/EBP wrap counter clockwise
                        dm.dmDisplayOrientation = NativeMethods.DMDO_90;
                        break;
                    case NativeMethods.DMDO_270:
                        dm.dmDisplayOrientation = NativeMethods.DMDO_180;
                        break;
                    case NativeMethods.DMDO_180:
                        dm.dmDisplayOrientation = NativeMethods.DMDO_90;
                        break;
                    case NativeMethods.DMDO_90:
                        dm.dmDisplayOrientation = NativeMethods.DMDO_DEFAULT;
                        break;
                    default:
                        // unknown orientation value
                        // add exception handling here
                        break;
                }
                int iRet = NativeMethods.ChangeDisplaySettings(ref dm, NativeMethods.CDS_TEST); 
                if (iRet == NativeMethods.DISP_CHANGE_FAILED) 
                { 
                    return "Unable To Process Your Request. Sorry For This Inconvenience."; 
                } 
                else 
                { 
                    iRet = NativeMethods.ChangeDisplaySettings(ref dm, NativeMethods.CDS_UPDATEREGISTRY); 
                    switch (iRet) 
                    { 
                        case NativeMethods.DISP_CHANGE_SUCCESSFUL: 
                            { 
                                return "Success"; 
                            } 
                        case NativeMethods.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 DEVMODE GetDevMode() 
        { 
            DEVMODE dm = new DEVMODE(); 
            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() 
}

Set-ScreenResolutionAndOrientation
codewario
  • 19,553
  • 20
  • 90
  • 159