Подтвердить что ты не робот

Как включить второй монитор в С#?

Можно ли включить второй монитор программно и расширить Windows Desktop на нем на С#? Он должен сделать эквивалент включения флажка на изображении ниже.

alt text http://i38.tinypic.com/27y8nt5.png

4b9b3361

Ответ 1

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

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

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

DISPLAY_DEVICE импорт структуры с помощью PInvoke

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

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

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

Ответ 2

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

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

затем DisplayChanger.Start();

Ответ 3

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

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

Ответ 4

Я ищу такое же решение. Я написал следующий код для вызова 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());

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

Ответ 5

Чтобы включить монитор, установите его положение на что-то отличное от 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);