Trabalhando com vários monitores em C#

Atualmente tenho trabalhado em um projeto interessante em C#, que trabalha muito com manipulação de imagens, vídeos em um ambiente onde existem diversos monitores, e cada janela deve startar no monitor especificado e com as resoluções apropriadas. Para isso eu criei uma classe auxiliar com alguns métodos que ajudam em tarefas simples, como saber quantos monitores existem, obter a posição necessária para iniciar a janela no monitor especificado, ver qual a resolução dos monitores, etc.

Trata-se de métodos bem simples e de fácil compreensão, onde é utilizado basicamente a api de System.Windows.Forms.Screen. Mais pra frente provavelmente eu incluirei métodos para trabalhar com manipulação da resolução, etc. Segue abaixo a classe:

using System;
using System.Drawing;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NamespaceXPTO.Screen
{
    public class ScreenProperties
    {

        public static bool hasMoreThanOneScreen()
        {
            return System.Windows.Forms.Screen.AllScreens.Length > 1;
        }

        public static int numberOfScreens()
        {
            return System.Windows.Forms.Screen.AllScreens.Length;
        }

        public static Rectangle getCurrentScreenBounds()
        {
            return System.Windows.Forms.Screen.PrimaryScreen.Bounds;
        }

        public static int getCurrentScreenX()
        {
            return System.Windows.Forms.Screen.PrimaryScreen.Bounds.X;
        }

        public static int getCurrentScreenY()
        {
            return System.Windows.Forms.Screen.PrimaryScreen.Bounds.Y;
        }

        public static int getCurrentScreenWidth()
        {
            return System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
        }

        public static int getCurrentScreenHeight()
        {
            return System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
        }

        public static Size getCurrentScreenResolution()
        {
            Rectangle rec = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
            return new Size(rec.Width, rec.Height);
        }

        public static Point getCurrentScreenLocation()
        {
            Rectangle rec = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
            return new Point(rec.X, rec.Y);
        }

        public static string getCurrentScreenName()
        {
            return System.Windows.Forms.Screen.PrimaryScreen.DeviceName;
        }

        public static Rectangle getScreenBounds(int index)
        {
            IEnumerator ie = System.Windows.Forms.Screen.AllScreens.GetEnumerator();
            while (ie.MoveNext())
            {
                if (getIndexFromName((ie.Current as System.Windows.Forms.Screen).DeviceName) == index)
                {
                    return (ie.Current as System.Windows.Forms.Screen).Bounds;
                }
            }
            return new Rectangle();
        }

        public static int getScreenX(int index)
        {
            IEnumerator ie = System.Windows.Forms.Screen.AllScreens.GetEnumerator();
            while (ie.MoveNext())
            {
                if (getIndexFromName((ie.Current as System.Windows.Forms.Screen).DeviceName) == index)
                {
                    Rectangle rec = (ie.Current as System.Windows.Forms.Screen).Bounds;
                    return rec.X;
                }
            }
            return 0;
        }

        public static int getScreenY(int index)
        {
            IEnumerator ie = System.Windows.Forms.Screen.AllScreens.GetEnumerator();
            while (ie.MoveNext())
            {
                if (getIndexFromName((ie.Current as System.Windows.Forms.Screen).DeviceName) == index)
                {
                    Rectangle rec = (ie.Current as System.Windows.Forms.Screen).Bounds;
                    return rec.Y;
                }
            }
            return 0;
        }

        public static Size getScreenResolution(int index)
        {
            IEnumerator ie = System.Windows.Forms.Screen.AllScreens.GetEnumerator();
            while (ie.MoveNext())
            {
                if (getIndexFromName((ie.Current as System.Windows.Forms.Screen).DeviceName) == index)
                {
                    Rectangle rec = (ie.Current as System.Windows.Forms.Screen).Bounds;
                    return new Size(rec.Width, rec.Height);
                }
            }
            return new Size();
        }

        public static Point getScreenLocation(int index)
        {
            IEnumerator ie = System.Windows.Forms.Screen.AllScreens.GetEnumerator();
            while (ie.MoveNext())
            {
                if (getIndexFromName((ie.Current as System.Windows.Forms.Screen).DeviceName) == index)
                {
                    Rectangle rec = (ie.Current as System.Windows.Forms.Screen).Bounds;
                    return new Point(rec.X, rec.Y);
                }
            }
            return new Point();
        }

        public static int getScreenWidth(int index)
        {
            IEnumerator ie = System.Windows.Forms.Screen.AllScreens.GetEnumerator();
            while (ie.MoveNext())
            {
                if (getIndexFromName((ie.Current as System.Windows.Forms.Screen).DeviceName) == index)
                {
                    Rectangle rec = (ie.Current as System.Windows.Forms.Screen).Bounds;
                    return rec.Width;
                }
            }
            return 0;
        }

        public static int getScreenHeight(int index)
        {
            IEnumerator ie = System.Windows.Forms.Screen.AllScreens.GetEnumerator();
            while (ie.MoveNext())
            {
                if (getIndexFromName((ie.Current as System.Windows.Forms.Screen).DeviceName) == index)
                {
                    Rectangle rec = (ie.Current as System.Windows.Forms.Screen).Bounds;
                    return rec.Height;
                }
            }
            return 0;
        }

        public static int getScreenIndex()
        {
            IEnumerator ie = System.Windows.Forms.Screen.AllScreens.GetEnumerator();
            while (ie.MoveNext())
            {
                if ((ie.Current as System.Windows.Forms.Screen).Primary == true)
                {
                    return getIndexFromName((ie.Current as System.Windows.Forms.Screen).DeviceName);
                }
            }
            return 0;
        }

        public static int getIndexFromName(string name)
        {
            return Convert.ToInt32(string.Join(null, System.Text.RegularExpressions.Regex.Split(name, "[^\\d]")));
        }

        public static List<System.Windows.Forms.Screen> getAllScreens()
        {
            IEnumerator ie = System.Windows.Forms.Screen.AllScreens.GetEnumerator();
            List<System.Windows.Forms.Screen> screens = new List<System.Windows.Forms.Screen>();
            while (ie.MoveNext())
            {
                screens.Add((ie.Current as System.Windows.Forms.Screen));
            }
            return screens;
        }

    }
}
Anúncios

4 comentários sobre “Trabalhando com vários monitores em C#

  1. Trabalho com video no monitor extendido e estou tentando resolver um pequeno problema que é o seguinte: Quando o usuário retira o cabo do monitor externo o windows dar um reset “pisca” a tela afim de remove o video anteriormente existente; ainda é o meu problema una que, a tela do meu programa fica toda bagunçada. Tem como evitar esse reset ou remontar a minha tela.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s