Windows 7 用于更改屏幕方向的Powershell脚本
我写了一个脚本,将主屏幕方向更改为纵向。我的屏幕是1920X1200 它运行并且没有报告错误。但是屏幕没有像我预期的那样旋转 代码是根据设置屏幕分辨率(Andy Schneider)修改的。Windows 7 用于更改屏幕方向的Powershell脚本,windows-7,multiple-monitors,powershell,orientation,for-loop,Windows 7,Multiple Monitors,Powershell,Orientation,For Loop,我写了一个脚本,将主屏幕方向更改为纵向。我的屏幕是1920X1200 它运行并且没有报告错误。但是屏幕没有像我预期的那样旋转 代码是根据设置屏幕分辨率(Andy Schneider)修改的。 有人能帮我看一下吗 一些参考网站: 设置屏幕分辨率: C更改方向代码(MSDN)以编程方式更改屏幕方向: 我的代码: Function Set-ScreenOrientation { $pinvokeCode = @" using System; using System.Runtime.
有人能帮我看一下吗 一些参考网站:
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()
}
函数集屏幕解析定向{
$pinvokeCode=@“
使用制度;
使用System.Runtime.InteropServices;
名称空间解析
{
[StructLayout(LayoutKind.Sequential)]
公共结构DEVMODE
{
[Marshallas(UnmanagedType.ByValTStr,SizeConst=32)]
公共字符串dmDeviceName;
公开短版本;
公开短讯;
公开短消息;
公共短dmDriverExtra;
公共域;
公共int DMX;
公共关系;
公众导向;
公共int dmDisplayFixedOutput;
公共短彩色;
公共短双工;
公共短期债务解决方案;
公共短期期权;
公开发行短期票据;
[Marshallas(UnmanagedType.ByValTStr,SizeConst=32)]
公共字符串dmFormName;
公共短像素;
公共短dmBitsPerPel;
公共int dmPelsWidth;
公共内特公寓;
公共int dmDisplayFlags;
公共整数显示频率;
公共管理方法;
公众意向;
公共媒体类型;
公共int-dmDitherType;
公共int dmReserved1;
公共int dmReserved2;
公共整数dmPanningWidth;
公共交通高度;
};
类本地方法
{
[DllImport(“user32.dll”)]
公共静态外部int EnumDisplaySettings(字符串deviceName、int modeNum、ref DEVMODE DEVMODE);
[DllImport(“user32.dll”)]
公共静态外部内部变更显示设置(ref DEVMODE DEVMODE,int标志);
public const int ENUM_CURRENT_SETTINGS=-1;
public const int CDS_UPDATEREGISTRY=0x01;
公共常数int CDS_TEST=0x02;
public const int DISP\u CHANGE\u SUCCESSFUL=0;
public const int DISP\u CHANGE\u RESTART=1;
public const int DISP\u CHANGE\u失败=-1;
public const int DMDO_默认值=0;
公共常数int DMDO_90=1;
公共常数int DMDO_180=2;
公共常数int DMDO_270=3;
}
公共类过滤解决方案
{
静态公共字符串changesolution()
{
DEVMODE dm=GetDevMode();
如果(0!=NativeMethods.EnumDisplaySettings(null,NativeMethods.ENUM\u当前\u设置,ref dm))
{
//交换宽度和高度
内部温度=dm.dmPelsHeight;
dm.dmPelsHeight=dm.dmPelsWidth;
dm.dmPelsWidth=温度;
//根据当前方向确定新方向
开关(dm.dmDisplayOrientation)
{
case NativeMethods.DMDO_默认值:
dm.dmDisplayOrientation=NativeMethods.DMDO_270;
打破
case NativeMethods.DMDO_270:
dm.dmDisplayOrientation=NativeMethods.DMDO_180;
打破
case NativeMethods.DMDO_180:
dm.dmDisplayOrientation=NativeMethods.DMDO_90;
打破
案例分析方法.DMDO_90:
dm.dmDisplayOrientation=NativeMethods.DMDO\u默认值;
打破
违约:
//未知方向值
//在此处添加异常处理
打破
}
int iRet=NativeMethods.ChangeDisplaySettings(参考dm,NativeMethods.CDS\U测试);
如果(iRet==NativeMethods.DISP\u CHANGE\u失败)
{
return“无法处理您的请求。对此给您带来的不便深表歉意。”;
}
其他的
{
iRet=NativeMethods.ChangeDisplaySettings(参考dm,NativeMethods.CDS\u UPDATEREGISTRY);
交换机(iRet)
{
case-NativeMethods.DISP\u CHANGE\u成功:
{
返回“成功”;
}
case NativeMethods.DISP\u CHANGE\u RESTART:
{
return“您需要重新启动才能进行更改。\n如果在重新启动计算机后发现任何问题,\n请尝试在安全模式下更改解决方案。”;
}
违约:
{
返回“更改决议失败”;
}
}
}
}
其他的
{
return“更改分辨率失败。”;
}
}
私有静态DEVMODE GetDevMode()
{
DEVMODE dm=新的DEVMODE();
dm.dmDeviceName=新字符串(新字符[32]);
dm.dmFormName=新字符串(新字符[32]);
dm.dmSize=(短)Marshal.SizeOf(dm);
返回dm;
}
}
}
"@
添加类型$pinvokeCode-ErrorAction SilentlyContinue
[决议.prmaryscreensolution]::changesolution()
}
设置屏幕分辨率和方向
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