Obecnie coraz częściej można zobaczyć osoby pracujące w biurach na dwóch lub więcej monitorach. Praca taka jest wygodniejsza oraz efektywniejsza. Sam, jako deweloper nie byłbym w stanie przesiąść się z powrotem na jeden monitor. Dlatego też nie widzę przeciwwskazań, aby własne aplikacje pisać w taki sposób, aby możliwa była praca na kilku monitorach. Oczywiście nie zawsze jest to wykonalne.
Sam zanim napisałem swoją pierwszą aplikację korzystającą z kilku monitorów, zastanawiałem się jak bardzo skomplikowaną funkcjonalność trzeba napisać, aby aplikacja zaczęła zachowywać się tak jak ja chcę. Okazało się, że nakład jest znikomy. Generalnie tworzenie takiej aplikacji składa się z dwóch kroków:
- zbadania systemu i ustalenia ile monitorów mamy do dyspozycji oraz jaką rozdzielczość oferują,
- wyświetlenia interesujących nas rzeczy na odpowiednim monitorze.
Pierwszą część można zrobić na dwa sposoby. Informacja o monitorach może zostać uzyskana wykorzystując dwie klasy:
- SystemInformation,
- Screen.
Doświadczenie pokazuje, że obydwie klasy dają takie same wyniki. Jednakże proponuję używać zawsze klasy Screen. Zgodnie z MSDN własność SystemInformation. MonitorCount jest wspierana tylko w Windows 98, Windows ME, Windows 2000, Windows XP i Windows 2003. Nie ma żadnej informacji, ani o Windows Vista, ani o Windows 7. Sprawdzając to na dostępnych maszynach, zawsze uzyskiwałem te same wyniki, ale w kodzie finalnym zawsze używam klasy Screen. Tak na wszelki wypadek.
Wywołanie dla SystemInformation:
System.Console.WriteLine("Primary screen resolution: " + SystemInformation.PrimaryMonitorSize); System.Console.WriteLine("Virtual size: " + SystemInformation.VirtualScreen); System.Console.WriteLine("Monitors count: " + SystemInformation.MonitorCount);
Wywołanie dla Screen:
foreach (Screen screen in Screen.AllScreens) { System.Console.WriteLine("Primary: " + screen.Primary); System.Console.WriteLine("Resolution: " + screen.Bounds); System.Console.WriteLine("Working area: " + screen.WorkingArea); System.Console.WriteLine("Device name: " + screen.DeviceName); System.Console.WriteLine(); }
Drugim elementem jest wyświetlenie kontrolki, bądź innego elementu UI w miejscu, którym chcemy. W tym przypadku wszystko zależy od nas. Generalnie kod wygląda w sposób następujący:
Form1 form1 = new Form1(); int controlPossition = 0; if (Screen.AllScreens.Length > 1) { foreach (Screen screen in Screen.AllScreens) { if (!screen.Primary) { controlPossition = screen.Bounds.X; break; } } form1.Left = controlPossition; form1.StartPosition = FormStartPosition.Manual; } form1.Show();
Należy przy tym pamiętać, że do komputera może być podpiętych więcej monitorów niż dwa oraz, że może wystąpić tylko jeden monitor. Dodatkowo może się okazać, że nawet jeśli są podpięte tylko dwa monitory to nie stoją one obok siebie, ale jeden na drugim. Dlatego też kod ten należy trochę zmodyfikować.
Mam nadzieję, że udało mi się pokazać, że napisanie aplikacji aktywnie korzystającej z dwóch monitorów jednocześnie nie jest skomplikowane oraz nie zwiększa znacząco ilości pracy w projekcie.
świetnym rozwiązaniem jest 'odpinanie’ części aplikacji, tak jak to oferuje Visual 2010 😉