2010-02-01 12 views
6

Me gustaría superponer un área gris y translúcida en toda la pantalla a través de C#. ¿Es posible hacerlo a través de Windows Forms y cómo voy a hacer esto?Superposición de pantalla para la captura de pantalla

+1

Oye, tal vez finalmente puedas hacer que ese maldito prompt UAC sea útil, si pudieras posicionar tu ventana sobre su prompt ... –

Respuesta

8

Claro, solo cree una ventana translúcida y sin bordes que cubra todas las pantallas de escritorio.

Puede encontrar el rectángulo derecho a cubrir todas las pantallas con la siguiente LINQ:

Rectangle bounds = Screen.AllScreens 
         .Select(x => x.Bounds) 
         .Aggregate(Rectangle.Union); 

asentando después la Izquierda, Arriba, anchura y altura de la ventana de bounds

+0

Correcto, me pregunto cómo hacerlo. Parece que no puedo crear una ventana sin bordes, y cada vez que selecciono el formulario para "maximizar", no cubre toda la pantalla, y pierde los 5 píxeles inferiores y los 10 píxeles a la derecha. – cam

+4

Maximizado probablemente no sea lo que quiere aquí. Desea que su ventana tenga el mismo tamaño que el área completa de la pantalla visible (en todas las pantallas, tal vez) y puede hacer que sea sin bordes estableciendo la propiedad 'FormBorderStyle' en' None'. – Joey

+2

+1 Buen uso de Linq para manejar múltiples pantallas, ¡gracias! – BillW

2

Además de el uso de la sugerencia para establecer el 'Johannes propiedad FormBorderStyle en' No, también me puse las siguientes propiedades en este formulario utilizado para 'dim-out' de la pantalla:

  1. TopMost, Mostrar InTaskBar, CuadroDeControl, MaximizeBox, MinimizeBox: 'Falso
  2. propiedad Text: claro que

fijaría el 'dim-out' tamaño de formulario en el evento de carga del formulario: me gustaría usar el elegante código en la respuesta de Rob para establecer los límites de un formulario agregado a un proyecto si quería manejar el caso de múltiples monitores. Si sólo quería manejar un solo monitor, que acababa de hacer algo tan simple como:

// in the Load Event of the "dim-out" Form 
    this.Bounds = Screen.PrimaryScreen.Bounds; 

Luego, por supuesto, puede mostrar esta "dim-out" Formulario cuando es necesario, en respuesta a lo que sea en tus Formas visibles.

Mostrar el formulario "dim-out" lo hará aparecer encima de las demás formas visibles de la aplicación (a menos que una de ellas tenga las propiedades TopMost o TopLevel establecidas).

Pero un buen efecto que puede lograr es mostrar su Formulario "dim-out" justo antes de mostrarse un MessageBox (o un formulario mostrado de forma modal): eso significa que tendrá el cuadro de diálogo MessageBox (o formulario modal) "al frente" con todo lo demás detrás "atenuado".

Así que aquí es como el código para mostrar la forma "atenuado" podría ser:

dimmedForm.Show(); 

    // change these to suit your taste or purpose 
    // this.BringToFront(); 
    // dimmedForm.BringToFront(); 

    // example of showing a MessageBox over the dimmedForm 
    // which will block the current thread 
    MessageBox.Show("why not ?"); 

    // now hide the dimmedForm 
    dimmedForm.Hide(); 

Es posible que desee echar un vistazo a la 'propiedad TopLevel (que no está expuesta en tiempo de diseño) y de actualización su conocimiento de cómo esa propiedad puede afectar el orden de los Formularios en la pantalla, así como el examen de la propiedad 'TopMost' de un Formulario (que está expuesto en el momento del diseño).

+2

Necesitamos una función de "combinación de respuestas" :) (+1) –

Cuestiones relacionadas