官方
环境:.Net framework4.7.2,控制台应用,理论上.NetCore、.Net5、.Net6都行,创建相应程序即可
using System.Runtime.InteropServices;
namespace SwitchScreen
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
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;
};
public class NativeMethods
{
// PInvoke declaration for EnumDisplaySettings Win32 API
[DllImport("user32.dll", CharSet = CharSet.Ansi)]
public static extern int EnumDisplaySettings(string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode);
// PInvoke declaration for ChangeDisplaySettings Win32 API
//官方这里写错了,字符串只需包括user32.dll即可,CharSet去掉也可以
//方法名:ChangeDisplaySettings = ChangeDisplaySettingsA
[DllImport("user32.dll", CharSet = CharSet.Ansi)]
public static extern int ChangeDisplaySettings(ref DEVMODE lpDevMode, int dwFlags);
// add more functions as needed ??
// constants
public const int ENUM_CURRENT_SETTINGS = -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;
// add more constants as needed ??
}
class Program
{
static void Main(string[] args)
{
// initialize the DEVMODE structure
DEVMODE dm = new DEVMODE();
dm.dmDeviceName = new string(new char[32]);
dm.dmFormName = new string(new char[32]);
dm.dmSize = (short)Marshal.SizeOf(dm);
if (0 != NativeMethods.EnumDisplaySettings(null, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm))
{
// swap width and height
//切换宽高影响切换顺序,只能顺时针旋转:先传1,再传2,3,4,
//1和4能切换,可以把宽高切换注释了,这样就可以颠倒切换了
int temp = dm.dmPelsHeight;
dm.dmPelsHeight = dm.dmPelsWidth;
dm.dmPelsWidth = temp;
if (args.Length > 0)
{
switch (args[0])
{
case "1":
dm.dmDisplayOrientation = NativeMethods.DMDO_270;
break;
case "2":
dm.dmDisplayOrientation = NativeMethods.DMDO_180;
break;
case "3":
dm.dmDisplayOrientation = NativeMethods.DMDO_90;
break;
case "4":
dm.dmDisplayOrientation = NativeMethods.DMDO_DEFAULT;
break;
default:
// unknown orientation value
// add exception handling here
break;
}
}
int iRet = NativeMethods.ChangeDisplaySettings(ref dm, 0);
//if (NativeMethods.DISP_CHANGE_SUCCESSFUL != iRet)
//{
// // add exception handling here
//}
}
}
}
}