control Multimonitor winform y procesos.

 Hola a todos!

Hace un tiempo que no escribo nada Nuevo en el blog, mucho trabajo estas semanas y una familia que atender es lo que tienen.

Peeero, para que la espera valga la pena, he estado estos últimos días preparando un custom control en .Net 3.5 y VB.NET 2008, sencillito pero útil. Se trata de un control que nos permitirá listar todos los monitores conectados a nuestro sistema y poder especificar por formulario (o a toda la aplicación) cual queremos usar en cada momento.

netmmonitor_1

 

No entrare a los pasos de diseño y creación de un Control, pues son los mismos que los de una aplicación tradicional, la única diferencia es que la salida es un ensamblado .dll y no un ejecutable.

La clase de vb.net que usamos para saber los monitores del sistema es la screens. Muy util para obtener mucha información de la configuración de pantalla en la que se ejecuta nuestra aplicación o, como en este caso, para añadir soporte multi monitor a nuestro programa.

En nuestro caso, quería cumplir 3 funciones con este control:

Poder reutilizar el código de monitores en cualquier aplicación con la implementación mas sencilla posible.

Abstraer todo el código y funcionalidad de nuestra aplicación y que fuese el control el que se encargase de realizar todo el trabajo.

Poder obtener un objeto con todos los datos de pantallas del sistema de forma sencilla y sin tener que escribir código.

Para todo esto el control cuenta con 3 variables internas privadas:

netmmonitor_2 

  Y para acceder a cada una de una forma correcta publica 3 propiedades públicas, 1 de ellas de tipo read only, al usar properties en vez de variables públicas estas apareceran en la ventana de propiedades del control cuando lo insertemos en un formulario, por lo que cumpliremos nuestro objetivo de no tener que escribir más código.

La primera propiedad es de tipo form y nos servira para controlar el formulario sobre el que queramos trabajar, al ser tan genérico, si nuestra aplicación es mdi y movemos el formulario principal moveremos toda la aplicación.

 netmmonitor_3

  La segunda propiedad es un array de solo lectura, de tipo STR_Monitores, una estructura propia que contiene todos los parámatros necesarios para trabajar con un monitor:

 netmmonitor_4

 Por medio de la propiedad pública nuestra aplicación podra obtener este array con todos los datos de pantallas conectadas al sistema y podremos usarlas de forma independiente al control, otra vez usando 0 código para obtener los datos.

netmmonitor_5

Por último la tercera propiedad pública nos permitira definir un poco en concreto el comportamiento de nuestro control, pues permite definir si queremos mover el formulario de pantalla, ocupando todo el espacio de la nueva pantalla ó tan solo moverlo sin modificar su tamaño.

netmmonitor_61

 

El resto del código del control es muy sencillo, obviando el código de los botones para avanzar y retroceder en el array de mvarMonitores, el código del Form_load que inicializa todos los objetos y obtiene los datos necesarios:

Este código es muy sencillo, simplemente redimensiona el array mvarMonitores al número de monitores presentes en el sistema (restandole 1, hay que recordar que la propiedad count devuelve el número de elementos en un array, empezando desde 1 y que los arrays tienen base 0), despues recorre la lista AllScreens dentro de la clase Screens para guardar los datos en nuestra estructura, usando una variable int indiceArray para recorrer el array mvarMonitores. Después selecciona el primer elemento del array y lo muestra en nuestra label de información.

Con esto, solo con colocar el control en nuestro formulario, obtendremos una estructura STR_monitores rellena y lista para usar.

netmmonitor_7

Y por último el código del botón que hace que nuestro formulario (el indicado en la propiedad) se mueva de pantalla, es en este momento en el que se tiene en cuenta la propiedad MoverYMaximizar, para tener en cuenta si solo debe moverse o también hay que cambiar el tamaño: 

netmmonitor_81 

El código es muy sencillo como veis, si le hemos indicado que mueva y maximice el formulario, simplemente asignara el tamaño del area de trabajo de la pantalla seleccionada a nuestro formulario, y después le asignara la nueva ubicación a nuestro formulario a traves de la propiedad Locatión del mismo.

Esto es así por que windows trata las pantallas como extensiones de nuestro escritorio, es decir, si tenemos 2 pantallas con una resolución de 1024×768, situada la secundaria a la derecha de la primaria, la esquina superior izquierda de nuestro primer monitor tendría las coordenadas x=0, y=0 y la misma esquina de nuestro segundo monitor tendría las cordenadas x=1024, y=0.

Como extra os dejo una función muy util, que en mi caso no está incluida dentro del control pues no me era necesaria, pero que puede ser muy ventajosa, Con estas funciones podremos ejecutar un proceso y asignarlo automáticamente al monitor que elijamos (que lo hemos podido obtener con nuestro control):

netmmonitor_9

 

Y el código para ejecutar un proceso y moverlo a la pantalla que deseemos.

 netmmonitor_10

 La parta más importante es el x.WaitForInputIdle, esta línea detiene la ejecución hasta que nuestro proceso esta listo para recibir ordenes, y entonces le asignamos el nuevo tamaño y la nueva posición.

 Bien, esto es todo, espero que os sea de ayuda y os divertais tanto como yo realizando este control, os dejo el codigo fuente y el ensamblado compilado para que lo useis libremente, si os es util, no olvideis decir donde lo encontrasteis.

_hdvista

Descargar NetMultiMonitor.zip

Un saludo.

Happy coding!

Anuncios
Publicado en Uncategorized. Etiquetas: , . 1 Comment »

Una respuesta to “control Multimonitor winform y procesos.”

  1. iMarrero Says:

    Buenísimo el artículo.
    Con esto las posibilidades de gestión de ventanas se multiplican.
    (ovación!!!)


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: