如何在 Win10 Pro 上通过 PowerShell 设置显示分辨率

如何在 Win10 Pro 上通过 PowerShell 设置显示分辨率

客户的 IT 管理员要求我“编写一个 powershell 脚本,在启动时手动设置分辨率”。如果他们要求我这样做,我想这是可能的。我对 powershell 完全没有经验。我的脚本/命令及其错误如下:

Set-DisplayResolution -Width 1024 -Height 768

Set-DisplayResolution不被识别为 cmdlet、函数、脚本文件或可运行程序的名称。

Set-ScreenResolution -Width 1024 -Height 768

Set-ScreenResolution不被识别为 cmdlet、函数、脚本文件或可运行程序的名称。

SetDisplayResolution -Width 1024 -Height 768

SetDisplayResolution不被识别为 cmdlet、函数、脚本文件或可运行程序的名称。

我遗漏了什么?谢谢。

在此处输入图片描述

答案1

不确定您的示例来自哪里,但在本机 powershell 中没有命令来设置分辨率。

我使用 AutoHotKey。您可以在那里构建自己的脚本,或者使用一个例子来自网络。

或者你可以编写自己的函数,可以从 powershell 调用:看这里

当然,根据您的需求,还有几种第三方工具可供选择。以下是一个例子也可以使用脚本,或者这里其他 7 人。你到底想干什么?

答案2

您需要安装显示设置来自 Powershell-Gallery 的模块来获取此功能。

模块安装

Install-Module -Name DisplaySettings

用法

Set-DisplayResolution -Width 800 -Height 600

答案3

Albin 的回答

创建一个 setResolution.ps1 文件,其内容如下(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

然后可以从 powershell 执行该文件,如下所示

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

答案4

Albin 帖子中的 powershell 脚本运行正常 - 但在一台机器上只允许我设置 1920x1080,而不能设置 1920x1200,我可以手动设置。最后我不得不使用 Nirsoft MultiMonitor,它允许您保存和加载配置文件。我可以编辑配置文件并输入分辨率参数,它运行得很好。配置文件如下所示:

Name=\\.\DISPLAY1
Width=1920
Height=1200

虽然我尽可能避免使用第三方工具,但这次它是免费的、轻量级的并且运行良好(并且没有任何病毒)......

相关内容