原文 http://www.cnblogs.com/coolkiss/archive/2013/09/18/3328854.html

经过google加各种百度,终于找到了一个有效的解决方案,下面是两个主要类,方便后人使用

1. Win32 API, 需要添加其它内容可以到这个网站从查找对应的c#实现

    public class WinApi
{
public const Int32 CCHDEVICENAME = ;
public const Int32 CCHFORMNAME = ; public enum DEVMODE_SETTINGS
{
ENUM_CURRENT_SETTINGS = (-),
ENUM_REGISTRY_SETTINGS = (-)
}
[Flags()]
public enum DisplayDeviceStateFlags : int
{
/// <summary>The device is part of the desktop.</summary>
AttachedToDesktop = 0x1,
MultiDriver = 0x2,
/// <summary>The device is part of the desktop.</summary>
PrimaryDevice = 0x4,
/// <summary>Represents a pseudo device used to mirror application drawing for remoting or other purposes.</summary>
MirroringDriver = 0x8,
/// <summary>The device is VGA compatible.</summary>
VGACompatible = 0x10,
/// <summary>The device is removable; it cannot be the primary display.</summary>
Removable = 0x20,
/// <summary>The device has more display modes than its output devices support.</summary>
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 = -,
DISP_CHANGE_BADMODE = -,
DISP_CHANGE_BADPARAM = -,
DISP_CHANGE_FAILED = -,
DISP_CHANGE_NOTUPDATED = -,
DISP_CHANGE_RESTART = ,
DISP_CHANGE_SUCCESSFUL =
} [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 = )]
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 = )]
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 = )]
public string DeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = )]
public string DeviceString;
[MarshalAs(UnmanagedType.U4)]
public DisplayDeviceStateFlags StateFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = )]
public string DeviceID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = )]
public string DeviceKey;
} public class User_32
{
[DllImport("user32.dll")]
public static extern int ChangeDisplaySettings(ref DEVMODE devMode, int flags); //[DllImport("user32.dll")]
//public static extern int ChangeDisplaySettingsEx(ref DEVMODE devMode, int flags); [DllImport("user32.dll")]
public static extern int ChangeDisplaySettingsEx(string lpszDeviceName, [In] ref DEVMODE lpDevMode, IntPtr hwnd, int dwFlags, IntPtr lParam); [DllImport("user32.dll")]
public static extern bool EnumDisplayDevices(string lpDevice, int iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, int dwFlags); [DllImport("user32.dll")]
public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE devMode);
} }

2. 更新主屏幕类

    public class ScreenHelper
{
public static List<Screen> GetAllScreen()
{
List<WinApi.DISPLAY_DEVICE> devices = new List<WinApi.DISPLAY_DEVICE>();
List<Screen> screens = new List<Screen>();
bool error = false;
//Here I am listing all DisplayDevices (Monitors)
for (int devId = ; !error; devId++)
{
try
{
WinApi.DISPLAY_DEVICE device = new WinApi.DISPLAY_DEVICE();
device.cb = Marshal.SizeOf(typeof(WinApi.DISPLAY_DEVICE));
error = !WinApi.User_32.EnumDisplayDevices(null, devId, ref device, );
if ((device.StateFlags & WinApi.DisplayDeviceStateFlags.AttachedToDesktop) == WinApi.DisplayDeviceStateFlags.AttachedToDesktop)
{
devices.Add(device);
}
}
catch (Exception)
{
error = true;
}
} devices.ForEach(d => {
WinApi.DEVMODE ndm = NewDevMode();
WinApi.User_32.EnumDisplaySettings(d.DeviceName, (int)WinApi.DEVMODE_SETTINGS.ENUM_REGISTRY_SETTINGS, ref ndm);
screens.Add(new Screen() {
DeviceMode = ndm,
ScreenDevice = d,
DeviceName = d.DeviceName,
IsPrimary = ((d.StateFlags & WinApi.DisplayDeviceStateFlags.PrimaryDevice) == WinApi.DisplayDeviceStateFlags.PrimaryDevice),
ScreenWidth = (int)ndm.dmPelsWidth,
ScreenHeight = (int)ndm.dmPelsHeight,
XPosition = (int)ndm.dmPosition.x,
YPosition = (int)ndm.dmPosition.y
});
}); return screens;
} public static void SetPrimaryScreen(string deviceName)
{
List<Screen> screenList = GetAllScreen();
Screen primaryScreen = GetPrimaryScreen(screenList);
if (primaryScreen.ScreenDevice.DeviceName == deviceName)
return; Screen newPrimaryScreen = GetScreen(deviceName); SwitchPrimaryScreen(newPrimaryScreen, primaryScreen); } public static Screen GetPrimaryScreen(List<Screen> devices)
{
foreach (Screen d in devices)
{
if ((d.ScreenDevice.StateFlags & WinApi.DisplayDeviceStateFlags.PrimaryDevice) == WinApi.DisplayDeviceStateFlags.PrimaryDevice)
{
return d;
}
}
return null;
} public static List<Screen> GetUnPrimaryScreen(List<Screen> devices)
{
List<Screen> dList = new List<Screen>(); foreach (Screen d in devices)
{
if ((d.ScreenDevice.StateFlags & WinApi.DisplayDeviceStateFlags.PrimaryDevice) != WinApi.DisplayDeviceStateFlags.PrimaryDevice)
{
dList.Add(d);
}
}
return dList;
} public static Screen GetScreen(string deviceName)
{
List<Screen> screenList = GetAllScreen();
return screenList.Where(p => p.ScreenDevice.DeviceName == deviceName).FirstOrDefault();
} private 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 = (int)newPrimary.DeviceMode.dmPelsWidth;
ndm3.dmPosition.y = ; WinApi.User_32.ChangeDisplaySettingsEx(oldPrimary.ScreenDevice.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 = ;
ndm4.dmPosition.y = ;
WinApi.User_32.ChangeDisplaySettingsEx(newPrimary.ScreenDevice.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.ScreenDevice.DeviceName, ref ndm5, (IntPtr)null, (int)WinApi.DeviceFlags.CDS_UPDATEREGISTRY, (IntPtr)null); WinApi.DEVMODE ndm6 = NewDevMode();
WinApi.User_32.ChangeDisplaySettingsEx(newPrimary.ScreenDevice.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[]);
dm.dmFormName = new String(new char[]);
dm.dmSize = (ushort)Marshal.SizeOf(dm);
return dm;
}
}

c# 多显示器设置主屏幕(Set primary screen for multiple monitors)的更多相关文章

  1. 关于在Safari浏览器中将网页添加到主屏幕的相关设置(自定义图标,启动动画,自定义名称)

    在ios中我们可以使用Safari浏览自带的将网页添加到主屏幕上,让我们的web页面看起来像native那样 第一步: 第二步: 第三步: 到这里还没结束:我们还要进行相关设置才能使我们的应用更像原生 ...

  2. 在CentOS 7 / Gnome 3 双屏时设置主屏

    在Windows中设置扩展显示器为主屏的方式非常清楚,但在Linux中就不是那么明显了,下面介绍如何完成这个设置 ------------------------------------------- ...

  3. C#操作电脑多显示器设置

    电脑多显示器设置 第一种方式 通过使用api函数SetDisplayConfig来设置.这种方式在某些电脑中设置有几率会导致电脑黑屏 使用代码如下: private const uint SDC_AP ...

  4. PL/SQL设置主键自增

    oracle没有设置主键auto increment的功能,需要自己编写序列和触发器实现主键自动递增. 示例: 创建表menu:   一.创建表 create table menu( menuId n ...

  5. Django数据库怎么给字段设置主键

    id = models.IntegerField(primary_key = True) 附: null :缺省设置为false.通常不将其用于字符型字段上,比如CharField,TextField ...

  6. SQL语句建表、设置主键、外键、check、default、unique约束

    · 什么是数据库? 存放数据的仓库. · 数据库和数据结构有什么区别? 数据结构要解决在内存中操作数据的问题,数据库要解决在硬盘中操作数据的问题.数据结构研究一些抽象数据模型(ADT)和以及定义在该模 ...

  7. iOS中为网站添加图标到主屏幕以及增加启动画面

    虽然没有能力开发Native App,但还是可以利用iOS中Safari浏览器的特性小小的折腾一下,做一个伪Web App满足下小小的虚荣心的. 既然是在iOS中的Safari折腾的,那么代码中利用到 ...

  8. windows系统操作类和演示程序(关机,关闭显示器,打开屏幕保护程序,打开光驱等)

    /// <summary> /// 系统控制类,关机,关闭显示器,打开屏幕保存程序等 /// </summary> public class SystemPowerContro ...

  9. 关于oracle设置主键自增的问题

    关于orcale设置主键自增的问题 关于主键Oracle中并没有提供一个直接的语句设置,对于这个oralce一般都是用序列和触发器来实现 一下又两种方法来实现 一 ,不使用触发器 创建序列: crea ...

随机推荐

  1. "Classifying plankton with deep neural networks" notes

    cross entropy loss is not quite the same as optimizing classification accuracy. Althougth the two ar ...

  2. centos6.4下没有heartbeat包解决办法

    1.在centos6.4 中使用yum install heartbeat,并没有发现heartbeat软件包 [root@master ~]# yum install heartbeat heart ...

  3. 轻松搞定javascript变量(闭包,预解析机制,变量在内存的分配 )

    变量:  存储数据的容器     1.声明        var   2.作用域       全局变量. 局部变量. 闭包(相对的全局变量):   3.类型         a.基本类型(undefi ...

  4. JavaScript基本概念(操作符)

    一元操作符 一元操作符在处理所有的非数值时,相当于将该值经过Number()转换成数值,如 +"12" 将把 "12" 字符串转换为数字. 位操作符 负数在计算 ...

  5. Spring摘记

    spring工作机制及为什么要用? 1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作.2.Dispatcher ...

  6. java线程管理

    java线程管理 参见: http://harmony.apache.org/subcomponents/drlvm/TM.html 1. 修订历史 2. 关于本文档 2.1. 目的 2.2. 面向的 ...

  7. 关于ztree打开关闭所有节点,选中指定id节点

    var isOneByOneExpand=false;//是否递归展开 //展开节点 function expendNode(nodeId){ var node = treeObj.getNodeBy ...

  8. Android不规则瀑布流照片墙的实现+LruCache算法

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZnJhbmNpc3NoaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  9. 发送通知:Notification

    Intent的主要功能是完成一个Activity跳转到其他Activity或者是Service的操作,表示的是一种 操作的意图. PendingIntent表示的是暂时执行的一种意图,是一种在产生某一 ...

  10. Linux下装Eclipse C/C++,以及环境配置

    由于前些日子朋友搞个智能家居开发,用C语言写的.叫我装个CentOS(Linux中的一种)来进行开发,所以这几天都在摸索怎么装,当然,朋友也有给予一丁点帮助(可恶的色长.你叫我装东西,也不帮帮我),由 ...