Programmatically changing the "presentation display mode"
Asked Answered
S

3

7

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.

Shishko answered 28/5, 2013 at 10:56 Comment(0)
T
13

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);
Taeniasis answered 28/5, 2013 at 11:56 Comment(2)
yeah this what i am looking for is there any way to do without using displayswitch.exe because i want to do it silently. in windows it will open the Project to a Connected screen and then it switches..Astragal
Wouldn't it be better (and more supported) to use the Win32 API functions instead of calling another program? What if the program goes away in a future version of Windows, or changes it's command-line syntax.Impediment
M
4

You can set the desktop display mode with SetDisplayConfig() eg.

SetDisplayConfig(0, NULL, 0, NULL, SDC_TOPOLOGY_EXTERNAL | SDC_APPLY);

You can retrieve the current display mode with QueryDisplayConfig(). eg.

DISPLAYCONFIG_TOPOLOGY_ID currentTopology;
QueryDisplayConfig(QDC_DATABASE_CURRENT, &PathArraySize, PathArray, &ModeArraySize, ModeArray, &currentTopology);

(Related source for this call here)

This is for C++. C# would require DLL imports.

Mainis answered 17/1, 2017 at 1:44 Comment(0)
T
2

You can obtain and change the display setting using EnumDisplaySettingsEx and ChangeDisplaySettingsEx:

The ChangeDisplaySettingsEx function changes the settings of the specified display device to the specified graphics mode.

Check this Codeproject project and this Stackoverflow question for example code

Taeniasis answered 28/5, 2013 at 11:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.