user568957
user568957

Reputation:

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.

Upvotes: 7

Views: 10825

Answers (3)

Greg
Greg

Reputation: 1251

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.

Upvotes: 4

dsfgsho
dsfgsho

Reputation: 2769

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);

Upvotes: 13

dsfgsho
dsfgsho

Reputation: 2769

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

Upvotes: 2

Related Questions