admin 管理员组

文章数量: 893893

win10屏幕旋转

官方
环境:.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 ??// constantspublic 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 structureDEVMODE 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 herebreak;}}int iRet = NativeMethods.ChangeDisplaySettings(ref dm, 0);//if (NativeMethods.DISP_CHANGE_SUCCESSFUL != iRet)//{//    // add exception handling here//}}}}
}

本文标签: win10屏幕旋转