我试图通过脚本(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
方法无法正常运作。
答案 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