I'm trying to write some code in C# that will switch between duplicate/mirror and extend display modes. I've found some existing resources ("Extend my Windows desktop onto this monitor" programmatically and How do I enable a second monitor in C#?) that tackle similar questions, but have not been able to get them to work specifically for this problem. While I can do this by summoning displayswitch.exe, it would be nice to be able to keep it in C# (not exactly sure why; convince me otherwise?). Does anyone have any example code that performs the equivalent of displayswitch.exe /clone and displayswitch.exe /extend?
            Asked
            
        
        
            Active
            
        
            Viewed 872 times
        
    -1
            
            
        
        askvictor
        
- 3,621
 - 4
 - 32
 - 45
 
1 Answers
0
            
            
        Some more digging finally yielded this post: how to set primary monitor for Windows-7, in C# which works for my purposes. I have lightly refactored that solution to use a Flags enum. More info on SetDisplayConfig: https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setdisplayconfig
    [Flags]
    public enum SetDisplayConfigFlags : uint
    {
        SDC_TOPOLOGY_INTERNAL = 0x00000001,
        SDC_TOPOLOGY_CLONE = 0x00000002,
        SDC_TOPOLOGY_EXTEND = 0x00000004,
        SDC_TOPOLOGY_EXTERNAL = 0x00000008,
        SDC_APPLY = 0x00000080
    }
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    private static extern long SetDisplayConfig(uint numPathArrayElements,
        IntPtr pathArray, uint numModeArrayElements, IntPtr modeArray, SetDisplayConfigFlags flags);
    static void CloneDisplays() {
        SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, SetDisplayConfigFlags.SDC_TOPOLOGY_CLONE | SetDisplayConfigFlags.SDC_APPLY);
    }
    static void ExtendDisplays() {
        SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, SetDisplayConfigFlags.SDC_TOPOLOGY_EXTEND | SetDisplayConfigFlags.SDC_APPLY);
    }
    static void ExternalDisplay() {
        SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, SetDisplayConfigFlags.SDC_TOPOLOGY_EXTERNAL | SetDisplayConfigFlags.SDC_APPLY);
    }
    static void InternalDisplay() {
        SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, SetDisplayConfigFlags.SDC_TOPOLOGY_INTERNAL | SetDisplayConfigFlags.SDC_APPLY);
    }
        askvictor
        
- 3,621
 - 4
 - 32
 - 45