当前位置: 移动技术网 > IT编程>开发语言>c# > C#如何动态设置屏幕分辨率

C#如何动态设置屏幕分辨率

2019年07月18日  | 移动技术网IT编程  | 我要评论
下面就不啰嗦了,直接看代码如何解决这个问题的。 首先,大家应该明确,现在没有可用的api来给我们动态地设置屏幕分辨率,我们要实现这个需求,我们只能在c#程序中调用win3

下面就不啰嗦了,直接看代码如何解决这个问题的。

首先,大家应该明确,现在没有可用的api来给我们动态地设置屏幕分辨率,我们要实现这个需求,我们只能在c#程序中调用win32 api 函数来解决这个问题的,这里用c#代码调用win32 api 就涉及到一个问题的,即.net 互操作性的问题,关于这个大家可以参考我的互操作性系列文章。这里我就不过多解释了。

我们要解决这个问题,首先大家肯定也会遇到一个经常遇到的问题,即如何获得用户的分辨率,对于这个问题,.net中提供的单独的类给我们调用,我们可以使用screen这个类,具体看下面的示例代码:

 screen screen = screen.primaryscreen;
      int screenwidth= screen.bounds.width;
      int screenheight = screen.bounds.height;

然后就是如何改变屏幕的分辨率呢?要更改显示设置可以通过使用两个 win32 api 来完成,这两个 api 都具有指向 devmode 结构的指针,它们分别包含与显示设置有关的所有信息:

使用 enumdisplaysettings 读取当前显示设置,并枚举所有受支持的显示设置。

使用 changedisplaysettings 切换到新的显示设置。

第一步、我们要先定义devmode 结构体,该结构的结构必须与devmode的结构一致,下面是c#中对devmode 结构体的定义代码:

// 映射 devmode 结构
  // 可以参照 devmode结构的指针定义:
  // http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565(v=vs.85).aspx
  [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;
  };

第二步、在托管环境下对win 32 函数进行声明:

// win32 函数在托管环境下的声明
  public 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;
  }

第三步、调用enumdisplaysettings和changedisplaysettings这两个函数来实现动态改变屏幕分辨率,具体代码如下:

  // 改变分辨率
    public changeresolution(int width, int height)
    {
      // 初始化 devmode结构
      devmode devmode = new devmode();
      devmode.dmdevicename = new string(new char[32]);
      devmode.dmformname = new string(new char[32]);
      devmode.dmsize = (short)marshal.sizeof(devmode);

      if (0 != nativemethods.enumdisplaysettings(null, nativemethods.enum_current_settings, ref devmode))
      {
        devmode.dmpelswidth = width;
        devmode.dmpelsheight = height;

        // 改变屏幕分辨率
        int iret = nativemethods.changedisplaysettings(ref devmode, nativemethods.cds_test);

        if (iret == nativemethods.disp_change_failed)
        {
          messagebox.show("不能执行你的请求", "信息", messageboxbuttons.ok, messageboxicon.information);
        }
        else
        {
          iret = nativemethods.changedisplaysettings(ref devmode, nativemethods.cds_updateregistry);

          switch (iret)
          {
              // 成功改变
            case nativemethods.disp_change_successful:
              {
                break;
              }
            case nativemethods.disp_change_restart:
              {
                messagebox.show("你需要重新启动电脑设置才能生效", "信息", messageboxbuttons.ok, messageboxicon.information);
                break;
              }
            default:
              {
                messagebox.show("改变屏幕分辨率失败", "信息", messageboxbuttons.ok, messageboxicon.information);
                break;
              }
          }
        }
      }
    }

为了大家更加形象地看到程序的运行结果,下面是一个演示效果:

以上就是本文的全部内容,希望对大家的学习有所帮助。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网