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

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

alt text http://sofru.miximages.com/c%23/27y8nt5.png

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

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

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

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

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

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

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

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

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

затем DisplayChanger.Start ();

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

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

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

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

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