在Windows 10上设置屏幕分辨率

时间:2016-06-07 12:09:54

标签: powershell

我试图通过脚本(Powershell)设置屏幕分辨率。 我找到了cmdlet Set-DisplayResolution,它应该适用于Server 2012 / R2和8 / 8.1(它不会工作),而且它也无法在Windows 10 PS 5.0上运行。

我也看过

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Screen]::AllScreens

[System.Windows.Forms.Screen]::PrimaryScreen

但它显示了奇怪的输出:

BitsPerPixel : 32
Bounds       : {X=0,Y=0,Width=2000,Height=1333}
DeviceName   : \\.\DISPLAY1
Primary      : True
WorkingArea  : {X=0,Y=0,Width=2000,Height=1293}

我运行的是3000x2000分辨率。即使我将显示器更改为1920x1080,输出也保持不变。

经过长时间的搜索后,我找到this script,它使用win32 API完成工作。有没有更方便的方法来执行此操作,因为此Set-DisplayResolution只是在Windows 10安装上运行?

我还想设置Windows 10的UI缩放(如150%)。 当然,我想知道为什么AllScreens的{​​{1}}和PrimaryScreen方法无法正常运作。

3 个答案:

答案 0 :(得分:1)

很抱歉告诉你,但是对于powershell来说是不可能的:

[System.Windows.Forms.Screen] - 命名空间表示您需要了解的全部内容:此命名空间引用您编码为Windows窗体的应用程序的显示区域(如果您需要更改窗口,则有用) - 申请中的大小)

Cmdlet Set-Displayresolution仅适用于Windows Server 2016 Core(或将来的任何其他Core-Server)。它记录在Technet上:https://technet.microsoft.com/de-de/library/jj603036(v=wps.630).aspx

使用前面找到的Win32-API的解决方法看起来是您可以获得的最佳解决方案。

答案 1 :(得分:1)

请参考以下脚本以更改Windows 10上的显示分辨率。Windows 10不支持PowerShell服务器核心。您可以使用以下脚本 重要:您可以在脚本末尾提供显示分辨率 当前将其设置为Set-ScreenResolution -Width 1920 -Height1080。您可以更改这些值。复制此完整脚本并另存为Set-ScreenResolution.ps1,然后使用PowerShell执行。确保以管理员身份运行powershell

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 1920 -Height 1080

答案 2 :(得分:0)

有点晚了,但根据您需要的分辨率设置,您可以使用AHK(脚本语言)。这将需要一个脚本打开显示设置对话框并向其发送点击或击键。如果您有兴趣,我可以提供更多信息

更新: 首先,您必须在计算机上安装AutoHotKey(这对于Google来说非常简单)。接下来,使用脚本将键盘输入发送到控制面板显示设置。它可能看起来像这样:

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#SingleInstance, force

detecthiddenwindows, on
; Use command prompt to open display settings
Run, %comspec% \k,,hide, cmd_pid
WinWait, ahk_pid %cmd_pid%
ControlSend, , control desk.cpl`n, ahk_pid %cmd_pid%

; Wait for display settings to open
WinWaitActive, Settings
sleep, 2000
; Send the appropriate key strokes to the settings menu to change the resolution

Send,{Tab 3}
sleep 100
Send,{Enter}

sleep 100
; Change this as needed to move to the desired display settings
Send,{Down 2}

sleep 100
Send,{Enter}
return