原文 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. SQL字符型字段按数字型字段排序实现方法(转)

    由于是按字母顺序排列,所以123排在了2的前面,显然不符合我们的要求,那么怎样才能按照我们预想的数字顺序排序呢 ORDER BY `meta_value`   那么按得分排序得到的结果可能是:1101 ...

  2. python排序(冒泡, 快速)

    之前用java时学习的一些基础算法,今天在python上也研究下. 1. 冒泡排序 算法步骤: 50   30   70  90 10 1)50 跟 30 比不用交换. 2)步数+1, 30 跟70比 ...

  3. linux---finger命令

    问题:CentOS7默认是没有安装finger这个程序的,所以finger命令执行不了. 解决方案: 1.安装finger yum -y install finger

  4. 正则语言(转的 大额_skylar )

    备注:正则表达式真的很头疼,收集起来,用起来很方便的. 常用的元字符 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或 ...

  5. Matlab.NET混编技巧之——找出Matlab内置函数

    原文 http://www.cnblogs.com/asxinyu/p/3295309.html Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯 定不难.反之,有时 ...

  6. Centos6.5升级gcc for qt5.3.1

    1.升级GCC CentOS6.5内置的GCC版本为4.4,而Qt5.2.1则需要4.8.2的支持(支持C++ 11特性),因此,必须先升级GCC wget http://ftp.tsukuba.wi ...

  7. 高仿精仿微信应用ios源码下载

    微信,超过3亿人使用,能够通过手机网络给好友发送语音.文字消息.表情.图片和视频,还可以分享照片到朋友圈.通过摇一摇.查看附近的人,你可以认识新的朋友.使用扫一扫,你可以扫描二维码.条码.图书和街景. ...

  8. Spring、XML配置AOP

    新建一个AOP类: public class MyInterceptor2 { public void doAccessCheck(){ System.out.println("前置通知 & ...

  9. 基于Linux 3.0.8 Samsung FIMC(S5PV210) 的摄像头驱动框架解读(一)

    作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 FIMC这个名字应该是从S5PC1x0開始出现的.在s5pv210里面的定义是摄像头接口.可是它相 ...

  10. IOS-时间与字符串互相转换

    有时会遇到这种问题,须要把时间和时间戳互相转换 比方把"这种格式 或者是把""转换成"2014-07-16 15:54:36" 首先来第一个: 当前时 ...