【问题标题】:Powershell script to change screen Orientation用于更改屏幕方向的 Powershell 脚本
【发布时间】:2012-09-20 14:53:36
【问题描述】:

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

代码是从 Set-ScreenResolution (Andy Schneider) 修改的。
有人可以帮我看看吗?

一些参考网站:

  1. 设置屏幕分辨率: http://gallery.technet.microsoft.com/ScriptCenter/2a631d72-206d-4036-a3f2-2e150f297515/

  2. C 代码更改或标识 (MSDN) 以编程方式更改屏幕方向: http://msdn.microsoft.com/en-us/library/ms812499.aspx

我的代码:

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() 
} 

【问题讨论】:

    标签: windows-7 multiple-monitors powershell orientation for-loop


    【解决方案1】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多