我正在尝试通过脚本(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
Run Code Online (Sandbox Code Playgroud)
和
[System.Windows.Forms.Screen]::PrimaryScreen
Run Code Online (Sandbox Code Playgroud)
但它显示了奇怪的输出:
BitsPerPixel : 32
Bounds : {X=0,Y=0,Width=2000,Height=1333}
DeviceName : \\.\DISPLAY1
Primary : True
WorkingArea : {X=0,Y=0,Width=2000,Height=1293}
Run Code Online (Sandbox Code Playgroud)
我正在运行3000x2000分辨率.即使我将显示器更改为1920x1080,输出也保持不变.
经过长时间的搜索后,我找到了这个脚本,它使用win32 API完成了这项工作.有没有更方便的方法来执行此操作,因为这Set-DisplayResolution只是在Windows 10安装上运行?
我还想设置Windows 10的UI缩放(如150%).当然,我想知道,为什么这些AllScreens和PrimaryScreen方法[System.Windows.Forms.Screen]不能正常运作.
小智 9
请参阅下面的脚本来更改 Windows 10 上的显示分辨率。Windows 10 不支持 PowerShell 服务器核心。您可以使用下面的脚本 重要提示:您可以在脚本末尾提供显示分辨率,当前它设置为 Set-ScreenResolution -Width 1920 -高度 1080。您可以更改这些值。复制此完整脚本并另存为 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
Run Code Online (Sandbox Code Playgroud)
小智 0
很抱歉告诉您,但使用 powershell 是不可能的:
[System.Windows.Forms.Screen] - 命名空间说明了您需要理解的所有内容:此命名空间指的是您编码为窗口窗体的应用程序的显示区域(如果您必须在其中更改窗口大小,则很有用)你的申请)
Cmdlet Set-Displayresolution 仅适用于 Windows Server 2016 Core(或将来的任何其他 Core-Server)。它记录在 Technet 上:https://technet.microsoft.com/de-de/library/jj603036(v =wps.630).aspx
您之前发现的使用 Win32-API 的解决方法看起来是您可以获得的最佳解决方案。