Windows 7 用于更改屏幕方向的Powershell脚本

Windows 7 用于更改屏幕方向的Powershell脚本,windows-7,multiple-monitors,powershell,orientation,for-loop,Windows 7,Multiple Monitors,Powershell,Orientation,For Loop,我写了一个脚本,将主屏幕方向更改为纵向。我的屏幕是1920X1200 它运行并且没有报告错误。但是屏幕没有像我预期的那样旋转 代码是根据设置屏幕分辨率(Andy Schneider)修改的。 有人能帮我看一下吗 一些参考网站: 设置屏幕分辨率: C更改方向代码(MSDN)以编程方式更改屏幕方向: 我的代码: Function Set-ScreenOrientation { $pinvokeCode = @" using System; using System.Runtime.

我写了一个脚本,将主屏幕方向更改为纵向。我的屏幕是1920X1200 它运行并且没有报告错误。但是屏幕没有像我预期的那样旋转

代码是根据设置屏幕分辨率(Andy Schneider)修改的。
有人能帮我看一下吗

一些参考网站:

  • 设置屏幕分辨率:

  • C更改方向代码(MSDN)以编程方式更改屏幕方向:

  • 我的代码:

    Function Set-ScreenOrientation { 
    
    
    
    $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; 
    
            [MarshalAs(UnmanagedType.U4)] 
            public short dmDisplayOrientation
    
            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 PrmaryScreenOrientation
        { 
            static public string ChangeOrientation() 
            { 
    
                DEVMODE1 dm = GetDevMode1(); 
    
                if (0 != User_32.EnumDisplaySettings(null, User_32.ENUM_CURRENT_SETTINGS, ref dm)) 
                { 
                    dm.dmDisplayOrientation = DMDO_90
                    dm.dmPelsWidth = 1200; 
                    dm.dmPelsHeight = 1920; 
    
                    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"; 
                                } 
                        } 
    
                    } 
    
    
                } 
                else 
                { 
                    return "Failed To Change."; 
                } 
            } 
    
            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.PrmaryScreenOrientation]::ChangeOrientation() 
    } 
    
    函数集屏幕解析定向{
    $pinvokeCode=@“
    使用制度;
    使用System.Runtime.InteropServices;
    名称空间解析
    { 
    [StructLayout(LayoutKind.Sequential)]
    公共结构DEVMODE
    { 
    [Marshallas(UnmanagedType.ByValTStr,SizeConst=32)]
    公共字符串dmDeviceName;
    公开短版本;
    公开短讯;
    公开短消息;
    公共短dmDriverExtra;
    公共域;
    公共int DMX;
    公共关系;
    公众导向;
    公共int dmDisplayFixedOutput;
    公共短彩色;
    公共短双工;
    公共短期债务解决方案;
    公共短期期权;
    公开发行短期票据;
    [Marshallas(UnmanagedType.ByValTStr,SizeConst=32)]
    公共字符串dmFormName;
    公共短像素;
    公共短dmBitsPerPel;
    公共int dmPelsWidth;
    公共内特公寓;
    公共int dmDisplayFlags;
    公共整数显示频率;
    公共管理方法;
    公众意向;
    公共媒体类型;
    公共int-dmDitherType;
    公共int dmReserved1;
    公共int dmReserved2;
    公共整数dmPanningWidth;
    公共交通高度;
    }; 
    类本地方法
    { 
    [DllImport(“user32.dll”)]
    公共静态外部int EnumDisplaySettings(字符串deviceName、int modeNum、ref DEVMODE DEVMODE);
    [DllImport(“user32.dll”)]
    公共静态外部内部变更显示设置(ref DEVMODE DEVMODE,int标志);
    public const int ENUM_CURRENT_SETTINGS=-1;
    public const int CDS_UPDATEREGISTRY=0x01;
    公共常数int CDS_TEST=0x02;
    public const int DISP\u CHANGE\u SUCCESSFUL=0;
    public const int DISP\u CHANGE\u RESTART=1;
    public const int DISP\u CHANGE\u失败=-1;
    public const int DMDO_默认值=0;
    公共常数int DMDO_90=1;
    公共常数int DMDO_180=2;
    公共常数int DMDO_270=3;
    } 
    公共类过滤解决方案
    { 
    静态公共字符串changesolution()
    { 
    DEVMODE dm=GetDevMode();
    如果(0!=NativeMethods.EnumDisplaySettings(null,NativeMethods.ENUM\u当前\u设置,ref dm))
    {
    //交换宽度和高度
    内部温度=dm.dmPelsHeight;
    dm.dmPelsHeight=dm.dmPelsWidth;
    dm.dmPelsWidth=温度;
    //根据当前方向确定新方向
    开关(dm.dmDisplayOrientation)
    {
    case NativeMethods.DMDO_默认值:
    dm.dmDisplayOrientation=NativeMethods.DMDO_270;
    打破
    case NativeMethods.DMDO_270:
    dm.dmDisplayOrientation=NativeMethods.DMDO_180;
    打破
    case NativeMethods.DMDO_180:
    dm.dmDisplayOrientation=NativeMethods.DMDO_90;
    打破
    案例分析方法.DMDO_90:
    dm.dmDisplayOrientation=NativeMethods.DMDO\u默认值;
    打破
    违约:
    //未知方向值
    //在此处添加异常处理
    打破
    }
    int iRet=NativeMethods.ChangeDisplaySettings(参考dm,NativeMethods.CDS\U测试);
    如果(iRet==NativeMethods.DISP\u CHANGE\u失败)
    { 
    return“无法处理您的请求。对此给您带来的不便深表歉意。”;
    } 
    其他的
    { 
    iRet=NativeMethods.ChangeDisplaySettings(参考dm,NativeMethods.CDS\u UPDATEREGISTRY);
    交换机(iRet)
    { 
    case-NativeMethods.DISP\u CHANGE\u成功:
    { 
    返回“成功”;
    } 
    case NativeMethods.DISP\u CHANGE\u RESTART:
    { 
    return“您需要重新启动才能进行更改。\n如果在重新启动计算机后发现任何问题,\n请尝试在安全模式下更改解决方案。”;
    } 
    违约:
    { 
    返回“更改决议失败”;
    } 
    } 
    } 
    } 
    其他的
    { 
    return“更改分辨率失败。”;
    } 
    } 
    私有静态DEVMODE GetDevMode()
    { 
    DEVMODE dm=新的DEVMODE();
    dm.dmDeviceName=新字符串(新字符[32]);
    dm.dmFormName=新字符串(新字符[32]);
    dm.dmSize=(短)Marshal.SizeOf(dm);
    返回dm;
    } 
    } 
    } 
    "@ 
    添加类型$pinvokeCode-ErrorAction SilentlyContinue
    [决议.prmaryscreensolution]::changesolution()
    }
    设置屏幕分辨率和方向
    
    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         
    #>
    
    $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;
                            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