Processing Ajax...

Title
Close Dialog

Message

Confirm
Close Dialog

Confirm
Close Dialog

Confirm
Close Dialog

Swap Primary Monitors (for 2 monitor setups)

Description
This script will make the opposite monitor Primary in 2 monitor setups.
Language
C#.net
Minimum Version
Created By
MaoYanwen298975
Contributors
-
Date Created
May 13, 2015
Date Last Modified
May 13, 2015

Scripted Function (Macro) Code

using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System;
using System.Drawing;
using System.Windows.Forms;

public static class DisplayFusionFunction
{
	public static void Run(IntPtr windowHandle)
	{
		//find a screen that isn't the primary screen
		Screen unPrimary = null;
		foreach (Screen screen in Screen.AllScreens)
		{
			if (screen.Primary)
				continue;

			unPrimary = screen;
			break;
		}

		//if this is null, the computer only has one screen
		if (unPrimary == null)
			return;

		ScreenHelper.SwitchPrimaryScreen(unPrimary, Screen.PrimaryScreen);
	}
}

public class WinApi
{
	public const Int32 CCHDEVICENAME = 32;
	public const Int32 CCHFORMNAME = 32;

	public enum DEVMODE_SETTINGS
	{
		ENUM_CURRENT_SETTINGS = (-1),
		ENUM_REGISTRY_SETTINGS = (-2)
	}
	
	[Flags()]
	public enum DisplayDeviceStateFlags : int
	{
		AttachedToDesktop = 0x1,
		MultiDriver = 0x2,
		PrimaryDevice = 0x4,
		MirroringDriver = 0x8,
		VGACompatible = 0x10,
		Removable = 0x20,
		ModesPruned = 0x8000000,
		Remote = 0x4000000,
		Disconnect = 0x2000000
	}

	public enum Display_Device_Stateflags
	{
		DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = 0x1,
		DISPLAY_DEVICE_MIRRORING_DRIVER = 0x8,
		DISPLAY_DEVICE_MODESPRUNED = 0x8000000,
		DISPLAY_DEVICE_MULTI_DRIVER = 0x2,
		DISPLAY_DEVICE_PRIMARY_DEVICE = 0x4,
		DISPLAY_DEVICE_VGA_COMPATIBLE = 0x10
	}

	public enum DeviceFlags
	{
		CDS_FULLSCREEN = 0x4,
		CDS_GLOBAL = 0x8,
		CDS_NORESET = 0x10000000,
		CDS_RESET = 0x40000000,
		CDS_SET_PRIMARY = 0x10,
		CDS_TEST = 0x2,
		CDS_UPDATEREGISTRY = 0x1,
		CDS_VIDEOPARAMETERS = 0x20,
	}

	public enum DEVMODE_Flags
	{
		DM_BITSPERPEL = 0x40000,
		DM_DISPLAYFLAGS = 0x200000,
		DM_DISPLAYFREQUENCY = 0x400000,
		DM_PELSHEIGHT = 0x100000,
		DM_PELSWIDTH = 0x80000,
		DM_POSITION = 0x20
	}

	public enum DisplaySetting_Results
	{
		DISP_CHANGE_BADFLAGS = -4,
		DISP_CHANGE_BADMODE = -2,
		DISP_CHANGE_BADPARAM = -5,
		DISP_CHANGE_FAILED = -1,
		DISP_CHANGE_NOTUPDATED = -3,
		DISP_CHANGE_RESTART = 1,
		DISP_CHANGE_SUCCESSFUL = 0
	}

	[StructLayout(LayoutKind.Sequential)]
	public struct POINTL
	{
		[MarshalAs(UnmanagedType.I4)] public int x;
		[MarshalAs(UnmanagedType.I4)] public int y;
	}

	[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
	public struct DEVMODE
	{
		[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string dmDeviceName;
		[MarshalAs(UnmanagedType.U2)] public UInt16 dmSpecVersion;
		[MarshalAs(UnmanagedType.U2)] public UInt16 dmDriverVersion;
		[MarshalAs(UnmanagedType.U2)] public UInt16 dmSize;
		[MarshalAs(UnmanagedType.U2)] public UInt16 dmDriverExtra;
		[MarshalAs(UnmanagedType.U4)] public DEVMODE_Flags dmFields;
		public POINTL dmPosition;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmDisplayOrientation;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmDisplayFixedOutput;
		[MarshalAs(UnmanagedType.I2)] public Int16 dmColor;
		[MarshalAs(UnmanagedType.I2)] public Int16 dmDuplex;
		[MarshalAs(UnmanagedType.I2)] public Int16 dmYResolution;
		[MarshalAs(UnmanagedType.I2)] public Int16 dmTTOption;
		[MarshalAs(UnmanagedType.I2)] public Int16 dmCollate;
		[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string dmFormName;
		[MarshalAs(UnmanagedType.U2)] public UInt16 dmLogPixels;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmBitsPerPel;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmPelsWidth;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmPelsHeight;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmDisplayFlags;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmDisplayFrequency;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmICMMethod;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmICMIntent;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmMediaType;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmDitherType;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmReserved1;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmReserved2;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmPanningWidth;
		[MarshalAs(UnmanagedType.U4)] public UInt32 dmPanningHeight;
	}

	[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
	public struct DISPLAY_DEVICE
	{
		[MarshalAs(UnmanagedType.U4)] public int cb;
		[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string DeviceName;
		[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string DeviceString;
		[MarshalAs(UnmanagedType.U4)] public DisplayDeviceStateFlags StateFlags;
		[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string DeviceID;
		[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string DeviceKey;
	}

	public class User_32
	{
		[DllImport("user32.dll")]
		public static extern int ChangeDisplaySettingsEx(string lpszDeviceName, [In] ref DEVMODE lpDevMode, IntPtr hwnd, int dwFlags, IntPtr lParam);
	}

}

public class ScreenHelper
{
	public static void SwitchPrimaryScreen(Screen newPrimary, Screen oldPrimary)
	{
		MoveOldPrimary(newPrimary, oldPrimary);
		MoveNewPrimary(newPrimary, oldPrimary);
		CommitChange(newPrimary, oldPrimary);
	}

	private static void MoveOldPrimary(Screen newPrimary, Screen oldPrimary)
	{
		WinApi.DEVMODE ndm3 = NewDevMode();
		ndm3.dmFields = WinApi.DEVMODE_Flags.DM_POSITION;
		ndm3.dmPosition.x = newPrimary.Bounds.Width;
		ndm3.dmPosition.y = 0;
		WinApi.User_32.ChangeDisplaySettingsEx(oldPrimary.DeviceName, ref ndm3, (IntPtr)null, (int)WinApi.DeviceFlags.CDS_UPDATEREGISTRY | (int)WinApi.DeviceFlags.CDS_NORESET, IntPtr.Zero);
	}

	private static void MoveNewPrimary(Screen newPrimary, Screen oldPrimary)
	{
		WinApi.DEVMODE ndm4 = NewDevMode();
		ndm4.dmFields = WinApi.DEVMODE_Flags.DM_POSITION;
		ndm4.dmPosition.x = 0;
		ndm4.dmPosition.y = 0;
		WinApi.User_32.ChangeDisplaySettingsEx(newPrimary.DeviceName, ref ndm4, (IntPtr)null, (int)WinApi.DeviceFlags.CDS_SET_PRIMARY | (int)WinApi.DeviceFlags.CDS_UPDATEREGISTRY | (int)WinApi.DeviceFlags.CDS_NORESET, IntPtr.Zero);
	}

	private static void CommitChange(Screen newPrimary, Screen oldPrimary)
	{
		WinApi.DEVMODE ndm5 = NewDevMode();
		WinApi.User_32.ChangeDisplaySettingsEx(oldPrimary.DeviceName, ref ndm5, (IntPtr)null, (int)WinApi.DeviceFlags.CDS_UPDATEREGISTRY, (IntPtr)null);

		WinApi.DEVMODE ndm6 = NewDevMode();
		WinApi.User_32.ChangeDisplaySettingsEx(newPrimary.DeviceName, ref ndm6, (IntPtr)null, (int)WinApi.DeviceFlags.CDS_SET_PRIMARY | (int)WinApi.DeviceFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);
	}

	private static WinApi.DEVMODE NewDevMode()
	{
		WinApi.DEVMODE dm = new WinApi.DEVMODE();
		dm.dmDeviceName = new String(new char[31]);
		dm.dmFormName = new String(new char[31]);
		dm.dmSize = (ushort)Marshal.SizeOf(dm);
		return dm;
	}
}