Reputation:
The presentation display modes are those you see when using the Windows+p shortcut:
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
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, ¤tTopology);
(Related source for this call here)
This is for C++. C# would require DLL imports.
Upvotes: 4
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
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