C#控制windows屏幕横屏,竖屏


前言

C#调用user32.dll更改显示器设置

一、为什么做?

在一个终端机的项目中,同事在本机调试时需要频繁切换显示器横竖屏,具体操作,点开电脑设置->找到屏幕设置->找到显示方向->下拉选中横屏/竖屏->弹框(是否保留当前显示器设置?保留更改or恢复)。。。。。。。
完整的操作需要点击大概8-10个操作。。。。频繁操作导致同事崩溃,,,于心不忍,查了下资料,写个小工具,方便操作。

二、怎么做

1.原理

调用user32.dl控制显示器设置
user32.dll是Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性,如创建窗口和发送消息。

2.界面示例

在这里插入图片描述
在这里插入图片描述

2.代码示例

代码如下(示例):

 public class NativeMethods
 {
     public static DEVMODE CreateDevmode()
     {
         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;
     }

     [DllImport("user32.dll", CharSet = CharSet.Ansi)]
     public static extern int EnumDisplaySettings(string lpszDeviceName, int iModeNum,ref DEVMODE lpDevMode);

     [DllImport("user32.dll")]
     public static extern int ChangeDisplaySettings(ref DEVMODE lpDevMode, int dwFlags);

     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;
 }
 [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 const int DM_DISPLAYFREQUENCY = 0x400000;
     public const int DM_PELSWIDTH = 0x80000;
     public const int DM_PELSHEIGHT = 0x100000;
     private const int CCHDEVICENAME = 32;
     private const int CCHFORMNAME = 32;
 };

代码如下(示例):

 public Form1()
 {
     InitializeComponent();
 }

 /// <summary>
 /// 横向
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void button1_Click(object sender, EventArgs e)
 {
     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, -1, ref dm))
     {
         // swap width and height
         int temp = dm.dmPelsHeight;
         dm.dmPelsHeight = dm.dmPelsWidth;
         dm.dmPelsWidth = temp;
         dm.dmDisplayOrientation = NativeMethods.DMDO_DEFAULT;
         int iRet = NativeMethods.ChangeDisplaySettings(ref dm, 0);
     }
 }

 /// <summary>
 /// 纵向
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void button2_Click(object sender, EventArgs e)
 {
     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, -1, ref dm))
     {
         // swap width and height
         int temp = dm.dmPelsHeight;
         dm.dmPelsHeight = dm.dmPelsWidth;
         dm.dmPelsWidth = temp;
         dm.dmDisplayOrientation = NativeMethods.DMDO_90;
         int iRet = NativeMethods.ChangeDisplaySettings(ref dm, 0);
     }
 }

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值