Search code examples
c#winapiinteropscreen-resolution

How to list available video modes using C#?


I've found nice examples using C++ (http://www.codeproject.com/KB/tips/resswitch.aspx), but not in C#.

Can someone help, please?

Edit: The exact function that list the video modes is:

BOOL CVideoModes::GetAvailableVideoModes(CAvailableVideoModes& modes)
{
  modes.SetSize(0, 5);
  int i=0;
  DEVMODE dm;

  while (EnumDisplaySettings(NULL, i, &dm))
  {
    CVideoMode thismode(dm.dmBitsPerPel, dm.dmPelsWidth, 
                        dm.dmPelsHeight, dm.dmDisplayFrequency);
    modes.SetAtGrow(i, thismode);
    ++i;
  }

  modes.FreeExtra();

  return (i>0);
}

But sincerelly I cannot understand that C++ code. Where I can find that "thismode" function?


Solution

  • If you mean video modes are available resolutions, try to invoke EnumDisplaySettingsEx

    details can be found here:

    http://msdn.microsoft.com/en-us/library/dd162612(VS.85).aspx

    small program that lists available resolutions:

    using System;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace ListResolutions
    {
    
        class Program
        {
            [DllImport("user32.dll")]
            public static extern bool EnumDisplaySettings(
                  string deviceName, int modeNum, ref DEVMODE devMode);
            const int ENUM_CURRENT_SETTINGS = -1;
    
            const int ENUM_REGISTRY_SETTINGS = -2;
    
            [StructLayout(LayoutKind.Sequential)]
            public struct DEVMODE
            {
    
                private const int CCHDEVICENAME = 0x20;
                private const int CCHFORMNAME = 0x20;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
                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 ScreenOrientation dmDisplayOrientation;
                public int dmDisplayFixedOutput;
                public short dmColor;
                public short dmDuplex;
                public short dmYResolution;
                public short dmTTOption;
                public short dmCollate;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
                public string dmFormName;
                public short dmLogPixels;
                public int 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;
    
            }
    
            static void Main(string[] args)
            {            
                    DEVMODE vDevMode = new DEVMODE();
                    int i = 0;
                    while (EnumDisplaySettings(null, i, ref vDevMode))
                    {
                        Console.WriteLine("Width:{0} Height:{1} Color:{2} Frequency:{3}",
                                                vDevMode.dmPelsWidth,
                                                vDevMode.dmPelsHeight,
                                                1 << vDevMode.dmBitsPerPel,         vDevMode.dmDisplayFrequency
                                            );
                    i++;
                    }
            }
    
        }
    
    }