Search code examples
c#winapimultiple-monitors

Programmatically changing the "presentation display mode"


The presentation display modes are those you see when using the Windows+p shortcut:

  1. Computer Only
  2. Duplicate
  3. Extend
  4. Projector Only

Do any API calls exist which allow one to switch between these display modes?

I want to programmatically switch between monitor and HDMI TV (and do a bunch of other things simultaneously, hence Windows+p not being useful), but I'm hitting a brick wall.


Solution

  • In case the EnumDisplaySettingsEx and ChangeDisplaySettingsEx functions do not work for you, you can also use this:

            private void SetDisplayMode(DisplayMode mode)
            {
                var proc = new Process();
                proc.StartInfo.FileName = "DisplaySwitch.exe";
                switch (mode)
                {
                    case DisplayMode.External:
                        proc.StartInfo.Arguments = "/external";
                        break;
                    case DisplayMode.Internal:
                        proc.StartInfo.Arguments = "/internal";
                        break;
                    case DisplayMode.Extend:
                        proc.StartInfo.Arguments = "/extend";
                        break;
                    case DisplayMode.Duplicate:
                        proc.StartInfo.Arguments = "/clone";
                        break;
                }
                proc.Start();
            }
            enum DisplayMode
            {
                Internal,
                External,
                Extend,
                Duplicate
            }
    

    This will call the DisplaySwitcher with different arguments based on the required configuration. You can thus call:

       SetDisplayMode(DisplayMode.Extend);