title: How to set screen resolution without having a monitor connected?
body: <p>In my company, we sometimes use surface automation to automate our processes. That means, that the program is searching for images on the screen and is clicking them, for example:</p>
  
  <p>We're developing using a screen resolution of <code>2560 x 1440</code>. We have many computers working there for us - and not all of them are always connected to a monitor. When I disconnect the monitor, windows is changing the resolution to <code>1024 x 768</code>. <strong>I'd like to avoid that</strong>. In the internet, I read about the tool NirCmd - but it's not so easy for me to use such a tool in my big, conservative company and I wonder, if there is a possibility with C#.</p>
  
  <p>I found a solution working perfectly - but only, if a monitor is connected (find the code at the end of this request). <strong>Is there a possibility to change the resolution even if there is no monitor connected?</strong> Or is there a possibility to define the resolution once and for all, windows is using without having a screen connected? This is not working for me:
  <a href="https://superuser.com/questions/604026/how-to-set-default-screen-resolution-and-color-depth-without-monitor-in-windows">https://superuser.com/questions/604026/how-to-set-default-screen-resolution-and-color-depth-without-monitor-in-windows</a></p>
  
  <p>Code that works fine - but only, if a screen is connected:</p>
  
  <pre><code>[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;
      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 static class ScreenResolution
  {
      /// &lt;summary&gt;
      /// Ändert die Bildschirmauflösung in die gewünschte Größe
      /// &lt;/summary&gt;
      /// &lt;param name="width"&gt;&lt;/param&gt;
      /// &lt;param name="height"&gt;&lt;/param&gt;
      public static void ChangeResolution(int width, int height)
      {
          Screen screen = Screen.PrimaryScreen;
  
          int iWidth = width;
          int iHeight = height;
  
          DEVMODE1 dm = new DEVMODE1();
          dm.dmDeviceName = new String(new char[32]);
          dm.dmFormName = new String(new char[32]);
          dm.dmSize = (short)Marshal.SizeOf(dm);
  
          if (0 != User_32.EnumDisplaySettings(null, User_32.ENUM_CURRENT_SETTINGS, ref dm))
          {
              dm.dmPelsWidth = iWidth;
              dm.dmPelsHeight = iHeight;
  
              int iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_TEST);
  
              if (iRet == User_32.DISP_CHANGE_FAILED)
              {
                  MessageBox.Show("Unable to process your request");
                  MessageBox.Show("Description: Unable To Process Your Request. Sorry For This Inconvenience.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
              }
              else
              {
                  iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_UPDATEREGISTRY);
  
                  switch (iRet)
                  {
                      case User_32.DISP_CHANGE_SUCCESSFUL:
                          {
                              break;
                              //successfull change
                          }
                      case User_32.DISP_CHANGE_RESTART:
                          {
                              MessageBox.Show("Description: 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.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                              break;
                              //windows 9x series you have to restart
                          }
                      default:
                          {
                              MessageBox.Show("Description: Failed To Change The Resolution.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                              break;
                              //failed to change
                          }
                  }
              }
          }
      }
  }
  </code></pre>