C# 如何以编程方式管理Windows 7中的多个显示设置?

C# 如何以编程方式管理Windows 7中的多个显示设置?,c#,windows-7,multiscreen,C#,Windows 7,Multiscreen,我需要更改分辨率、位置,并选择哪个是主显示,最好是在.NET中。我认为您可以通过p/Invoke使用User32.dll api函数来完成。 . 示例代码: [DllImport("User32.dll")] static extern long ChangeDisplaySettings(ref DeviceMode lpDevMode, int dwflags); [DllImport("User32.dll")] static extern int EnumDisplaySetting

我需要更改分辨率、位置,并选择哪个是主显示,最好是在.NET中。

我认为您可以通过p/Invoke使用User32.dll api函数来完成。
.

示例代码:

[DllImport("User32.dll")]
static extern long ChangeDisplaySettings(ref DeviceMode lpDevMode, int dwflags);

[DllImport("User32.dll")]
static extern int EnumDisplaySettings(string lpszDeviceName, int iModeNum, ref DeviceMode lpDevMode);

[DllImport("User32.dll")]
static extern int EnumDisplayDevices(string lpDevice, int iDevNum, ref DisplayDevice lpDisplayDevice, int dwFlags);
更改屏幕分辨率的代码:

//DisplayDevice is a wrapper ... you can find it [here](http://pinvoke.net/default.aspx/Structures/DISPLAY_DEVICE.html)
List<DisplayDevice> devices = new List<DisplayDevice>();

bool error = false;
//Here I am listing all DisplayDevices (Monitors)
for (int devId = 0; !error; devId++)
{
    try
    {
        DisplayDevice device = new DisplayDevice();
        device.cb = Marshal.SizeOf(typeof(DisplayDevice));
        error = EnumDisplayDevices(null, devId, ref device, 0) == 0;
        devices.Add(device);
    }
    catch (Exception)
    {
        error = true;
    }
}

List<DisplaySet> devicesAndModes = new List<DisplaySet>();

foreach (var dev in devices)
{
    error = false;
    //Here I am listing all DeviceModes (Resolutions) for each DisplayDevice (Monitors)
    for (int i = 0; !error; i++)
    {
        try
        {
            //DeviceMode is a wrapper. You can find it [here](http://pinvoke.net/default.aspx/Structures/DEVMODE.html)
            DeviceMode mode = new DeviceMode();
            error = EnumDisplaySettings(dev.DeviceName, -1 + i, ref mode) == 0;
            //Display 
            devicesAndModes.Add(new DisplaySet { DisplayDevice = dev, DeviceMode = mode });
        }
        catch (Exception ex)
        {
            error = true;
        }
    }
}

//Select any 800x600 resolution ...
DeviceMode d800x600 = devicesAndModes.Where(s => s.DeviceMode.dmPelsWidth == 800).First().DeviceMode;

//Apply the selected resolution ...
ChangeDisplaySettings(ref d800x600, 0);
//DisplayDevice是一个包装器。。。你可以在这里找到它(http://pinvoke.net/default.aspx/Structures/DISPLAY_DEVICE.html)
列表设备=新列表();
布尔误差=假;
//这里我列出了所有的显示设备(监视器)
对于(int-devId=0;!error;devId++)
{
尝试
{
DisplayDevice设备=新的DisplayDevice();
device.cb=Marshal.SizeOf(typeof(DisplayDevice));
error=EnumDisplayDevices(null,devId,ref-device,0)=0;
设备。添加(设备);
}
捕获(例外)
{
错误=真;
}
}
列表设备和模式=新列表();
foreach(设备中的var-dev)
{
错误=错误;
//这里我列出了每个显示设备(监视器)的所有设备模式(分辨率)
对于(int i=0;!error;i++)
{
尝试
{
//DeviceMode是一个包装器。你可以在这里找到它(http://pinvoke.net/default.aspx/Structures/DEVMODE.html)
DeviceMode=新的DeviceMode();
错误=EnumDisplaySettings(dev.DeviceName,-1+i,参考模式)=0;
//展示
添加(新的显示集{DisplayDevice=dev,DeviceMode=mode});
}
捕获(例外情况除外)
{
错误=真;
}
}
}
//选择任意800x600分辨率。。。
DeviceMode d800x600=设备和模式。其中(s=>s.DeviceMode.dmPelsWidth==800)。第一个().DeviceMode;
//应用选定的分辨率。。。
更改显示设置(参考d800x600,0);

请参见和问题1:不要回答我的问题和问题2。这样更好,但也很麻烦,我想知道.NET中是否有一个包装器用于这些windows API