ChangeDisplaySettingsEx (user32)
Last changed: 69.31.51.187

.
Summary

C# Signature:

[DllImport("user32.dll")]
static extern DISP_CHANGE ChangeDisplaySettingsEx(string lpszDeviceName, ref DEVMODE lpDevMode, IntPtr hwnd, uint dwflags, IntPtr lParam);

VB.NET

<DllImport("user32.dll")> _
Private Shared Function ChangeDisplaySettingsEx(ByVal lpszDeviceName As String, ByRef lpDevMode As DEVMODE, ByVal hwnd As IntPtr, ByVal dwflags As UInteger, ByVal lParam As IntPtr) As DISP_CHANGE
End Function

User-Defined Types:

DISP_CHANGE

Notes:

None.

Tips & Tricks:

To change the postion of a secondary device it is very important to use dmPositionX and dmPositionY from DEVMODE (see structs).

First i tried it with a PointL struct dmPosition.x and dmPosition.y until i luckily found this page:

http://msdn2.microsoft.com/en-us/library/aa719104(vs.71).aspx

Sample Code:

DISPLAY_DEVICE d = new DISPLAY_DEVICE();
DEVMODE dm = new DEVMODE();
d.cb = Marshal.SizeOf(d);
int deviceID=1; // This is only for my device setting. Go through the whole EnumDisplayDevices to find your device  
EnumDisplayDevices(null,deviceID, ref  d, 0); //
EnumDisplaySettings(d.DeviceName, 0, ref dm);
dm.dmPelsWidth = 1024;
dm.dmPelsHeight = 768;
dm.dmPositionX = Screen.PrimaryScreen.Bounds.Right;
dm.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT;
ChangeDisplaySettingsEx(d.DeviceName, ref dm, IntPtr.Zero, CDS_UPDATEREGISTRY, IntPtr.Zero);

Constants for dmFields:

public const int DM_ORIENTATION = 0x00000001;

public const int DM_PAPERSIZE = 0x00000002;

public const int DM_PAPERLENGTH = 0x00000004;

public const int DM_PAPERWIDTH = 0x00000008;

public const int DM_SCALE = 0x00000010;

public const int DM_POSITION = 0x00000020;

public const int DM_NUP = 0x00000040;

public const int DM_DISPLAYORIENTATION = 0x00000080;

public const int DM_COPIES = 0x00000100;

public const int DM_DEFAULTSOURCE = 0x00000200;

public const int DM_PRINTQUALITY = 0x00000400;

public const int DM_COLOR = 0x00000800;

public const int DM_DUPLEX = 0x00001000;

public const int DM_YRESOLUTION = 0x00002000;

public const int DM_TTOPTION = 0x00004000;

public const int DM_COLLATE = 0x00008000;

public const int DM_FORMNAME = 0x00010000;

public const int DM_LOGPIXELS = 0x00020000;

public const int DM_BITSPERPEL = 0x00040000;

public const int DM_PELSWIDTH = 0x00080000;

public const int DM_PELSHEIGHT = 0x00100000;

public const int DM_DISPLAYFLAGS = 0x00200000;

public const int DM_DISPLAYFREQUENCY = 0x00400000;

public const int DM_ICMMETHOD = 0x00800000;

public const int DM_ICMINTENT = 0x01000000;

public const int DM_MEDIATYPE = 0x02000000;

public const int DM_DITHERTYPE = 0x04000000;

public const int DM_PANNINGWIDTH = 0x08000000;

public const int DM_PANNINGHEIGHT = 0x10000000;

public const int DM_DISPLAYFIXEDOUTPUT = 0x20000000;

Alternative Managed API:

Do you know one? Please contribute it!

Documentation