public static string SetPrimary(string deviceName)
{
var id = int.Parse(Regex.Match(deviceName, @"\d+").Value) - 1;
var originalMode = new Devmode();
originalMode.dmSize = (short) Marshal.SizeOf(originalMode);
EnumDisplaySettings(deviceName, ENUM_CURRENT_SETTINGS, ref originalMode);
var offsetx = originalMode.dmPositionX;
var offsety = originalMode.dmPositionY;
originalMode.dmPositionX = 0;
originalMode.dmPositionY = 0;
ChangeDisplaySettingsEx(deviceName, ref originalMode, (IntPtr) null,
ChangeDisplaySettingsFlags.CDS_SET_PRIMARY | ChangeDisplaySettingsFlags.CDS_UPDATEREGISTRY |
ChangeDisplaySettingsFlags.CDS_NORESET, IntPtr.Zero);
var device = new DisplayDevice();
device.cb = Marshal.SizeOf(device);
// Update remaining devices
for (uint otherid = 0; EnumDisplayDevices(null, otherid, ref device, 0); otherid++)
{
if (device.StateFlags.HasFlag(DisplayDeviceStateFlags.AttachedToDesktop) && otherid != id)
{
device.cb = Marshal.SizeOf(device);
var otherDeviceMode = new Devmode();
EnumDisplaySettings(device.DeviceName, -1, ref otherDeviceMode);
otherDeviceMode.dmPositionX -= offsetx;
otherDeviceMode.dmPositionY -= offsety;
ChangeDisplaySettingsEx(
device.DeviceName,
ref otherDeviceMode,
(IntPtr) null,
ChangeDisplaySettingsFlags.CDS_UPDATEREGISTRY | ChangeDisplaySettingsFlags.CDS_NORESET,
IntPtr.Zero);
}
device.cb = Marshal.SizeOf(device);
}
// Apply settings
return
GetMessageForCode(ChangeDisplaySettingsEx(null, IntPtr.Zero, (IntPtr) null,
ChangeDisplaySettingsFlags.CDS_NONE, (IntPtr) null));
}