Как включить второй монитор в C #? - PullRequest
19 голосов
/ 24 октября 2008

Можно ли программно включить второй монитор и расширить на него рабочий стол Windows в C #? Нужно сделать то же самое, что включить флажок на изображении ниже.

alt text

Ответы [ 5 ]

13 голосов
/ 24 октября 2008

Контекстные функции устройства MSDN

Что вам в основном нужно сделать:

Использование вызова API EnumDisplayDevices () перечислить устройства отображения на система и искать те, которые не имеют DISPLAY_DEVICE_ATTACHED_TO_DESKTOP флаг установлен (это будет включать любой зеркальные устройства, так что не все будет физические дисплеи.) Как только вы нашли устройство отображения вам нужно получить действительный режим отображения, чтобы изменить его, Вы можете найти это, позвонив Вызов API EnumDisplaySettingsEx () - Вообще вы бы отображали все доступные режимы и позволяют пользователю выберите, однако, в вашем случае это звучит как это может быть возможно для жесткого кода и сэкономить вам дополнительный шаг. За ради будущего вашего приложение, хотя я бы предложил иметь это легко изменить, не имея копаться в источнике каждый раз, ключ реестра будет очевидным выбор. Как только вы это отсортировали заполнить дисплей DevMode структура с информацией о расположение дисплея (установите PelsWidth / Height, Position, DisplayFrequency и BitsPerPel свойства), затем установите эти флаги в член полей. Наконец позвони ChangeDisplaySettingsEx () с этим настройте структуру и обязательно отправьте сбросить и обновить флаги реестра. Это должно быть все, что вам нужно, надеюсь, это помогает,

DISPLAY_DEVICE импорт структуры с использованием PInvoke

EnumDisplayDevices функция импорта

EnumDisplaySettingsEx функция импорта

и т.д.. остальные функции можно найти с помощью простого поиска по имени.

11 голосов
/ 27 июня 2010

Если у вас Windows 7, просто запустите процесс:

    private static Process DisplayChanger = new Process
    {
        StartInfo =
        {
            CreateNoWindow = true,
            WindowStyle = ProcessWindowStyle.Hidden,
            FileName = "DisplaySwitch.exe",
            Arguments = "/extend"
        }
    };

затем DisplayChanger.Start ();

2 голосов
/ 24 октября 2008

У меня нет полного ответа, но я почти уверен, что вам придется позвонить из .Net, чтобы сделать это. Вам придется использовать Pinvoke для вызова неуправляемой DLL. Большой ресурс для этого - pinvoke.net.

Я сделал быстрый поиск и нашел http://www.pinvoke.net/default.aspx/user32/ChangeDisplaySettings.html, что, вероятно, не совсем то, что вы хотите, но вы, вероятно, найдете его где-нибудь на pinvoke.net

1 голос
/ 10 февраля 2011

Чтобы включить монитор, установите его положение, отличное от 0,0, как показано:

POINTL enabledPosition = new POINTL();
enabledPosition.x = -1280;
enabledPosition.y = 0;

dm.dmPosition = enabledPosition;
dm.dmFields = DM.Position;
res = ChangeDisplaySettingsEx(d.DeviceName, ref dm, IntPtr.Zero, (uint) DeviceFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);
1 голос
/ 03 февраля 2009

Я ищу то же решение. Я написал следующий код для вызова ChangeDisplaySettingsEx с помощью PInvoke:

DEVMODE dm = new DEVMODE();
dm.dmSize = (short)Marshal.SizeOf(dm);
dm.dmPelsWidth = 1680;
dm.dmPelsHeight = 1050;
dm.dmBitsPerPel = 32;
dm.dmDisplayFrequency = 60;
dm.dmFields = DevModeFields.DM_BITSPERPEL | DevModeFields.DM_PELSWIDTH | 
              DevModeFields.DM_PELSHEIGHT | DevModeFields.DM_DISPLAYFREQUENCY;
int res = ChangeDisplaySettingsEx(@"\\.\DISPLAY2", ref dm, IntPtr.Zero, CDS_RESET | CDS_UPDATEREGISTRY, IntPtr.Zero);
Console.WriteLine("result = " + res.ToString());

Если монитор уже включен, это успешно меняет разрешение. Но если монитор еще не подключен к рабочему столу, он не будет активирован. Так у кого-нибудь есть пример кода, который работает?

...