Как программно управлять настройкой нескольких дисплеев в Windows 7? - PullRequest
3 голосов
/ 20 июля 2011

Мне нужно изменить разрешение, положение и выбрать, какой из них является основным дисплеем, желательно в .NET.

1 Ответ

5 голосов
/ 20 июля 2011

Я думаю, что вы можете сделать это, используя API-функции User32.dll через P / Invoke.
См. Доступные функции .

Пример кода:

[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);
...