2008-09-22 29 views
21

Estoy usando Windows Vista y C# .net 3.5, pero hice que mi amigo ejecutara el programa en XP y tiene el mismo problema.C# - ¿Por qué una aplicación winform de pantalla completa SIEMPRE no cubre la barra de tareas?

Así que tengo un programa C# que tengo corriendo en segundo plano con un ícono en SystemTray. Tengo un gancho de teclado de bajo nivel, así que cuando presiono dos teclas (Ctrl + Windows en este caso) extraeré el formulario principal de la aplicación. El formulario está configurado para ser pantalla completa en la tecla combinada presionar controlador par:

this.FormBorderStyle = FormBorderStyle.None; 
this.WindowState = FormWindowState.Maximized; 

Así que básicamente funciona. Cuando presiono CTR + Windows, aparece el formulario, sin importar a qué programa me he enfocado. Pero a veces, la barra de tareas seguirá apareciendo en el formulario, que no quiero. Quiero que siempre sea pantalla completa cuando presiono esa combinación de teclas.

Creo que tiene algo que ver con qué aplicación tiene foco originalmente. Pero incluso cuando hago clic en mi formulario principal, la barra de tareas a veces se queda allí. Entonces me pregunto si el enfoque realmente es el problema. Parece que a veces la barra de tareas es obstinada y no quiere sentarse detrás de mi programa.

¿Alguien tiene alguna idea de cómo puedo solucionar esto?

EDITAR: Más detalles- Estoy tratando de lograr el mismo efecto que tiene un navegador web cuando lo pones en modo de pantalla completa, o cuando pones powerpoint en el modo de presentación.

En una forma de Windows lo hace poniendo el estilo de borde en ninguno y maximizando la ventana. Pero a veces la ventana no cubrirá la barra de tareas por alguna razón. La mitad del tiempo lo hará.

Si tengo la ventana principal en la parte superior, los demás se quedarán atrás cuando haga clic en ella, lo cual no quiero si la barra de tareas está oculta.

Respuesta

18

probar este (donde this es su forma):

this.Bounds = Screen.PrimaryScreen.Bounds; 
this.TopMost = true; 

Eso va a establecer el formulario a pantalla completa, y cubrirá la barra de tareas.

+1

Para que esto funcione, quiere asegurarse de que el formulario * no * esté maximizado. –

+0

Oh, el único problema es que no puedo tenerlo como TopMost, porque tengo otras ventanas que están encima de él que son TopMost, así que si hago clic en 'esto', todas las demás ventanas irán detrás de él. – Joel

+2

Heh. Detalles menores allí. Tengo mis dudas sobre si lo que desea puede hacerse * sin * TopMost si el usuario tiene "Mantener la barra de tareas en la parte superior de otras ventanas" marcada. Pero también puede tener múltiples ventanas de TopMost, y la activa será, uh, TopMostest. –

0

Por lo que yo sé, la barra de tareas está arriba o abajo de las ventanas según la opción "Mantener la barra de tareas encima de otras ventanas". (Al menos, esa es la redacción en XP.) Supongo que podrías tratar de ver si puedes detectar esta configuración y alternarla si es necesario.

+4

Es una mala práctica cambiar la configuración elegida por el usuario según sus preferencias.Es mejor descubrir cómo usar las API para obtener el comportamiento que desea de la manera correcta. – Wedge

+0

Esa configuración solo se aplica a las aplicaciones con ventana, no a la pantalla completa. Porque cuando juego juegos o pongo mi navegador web a pantalla completa, cubrirá la barra de tareas. – Joel

+0

Las aplicaciones de pantalla completa, como los juegos, están cambiando el modo de visualización a DirectX u OpenGL o algo completamente distinto del sistema de ventanas, que da acceso al programa al buffer de video sin formato. Esto es desde dentro del sistema de ventanas, por lo que se aplica la configuración que mencioné. – jdmichal

0

intente cambiar el tamaño del formulario y llevarlo a la parte delantera del orden z de este modo:

 Rectangle screenRect = Screen.GetBounds(this); 
     this.Location = screenRect.Location; 
     this.Size = screenRect.Size; 
     this.BringToFront(); 
1
private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.F11) 
     if (FormBorderStyle == FormBorderStyle.None) 
     { 
      FormBorderStyle = FormBorderStyle.Sizable; 
      WindowState = FormWindowState.Normal; 
     } 
     else 
     { 
      SuspendLayout(); 
      FormBorderStyle = FormBorderStyle.None; 
      WindowState = FormWindowState.Maximized; 
      ResumeLayout(); 
     } 
} 
2

que he probado hasta muchas soluciones, algunas de ellas funciona en Windows XP y todos ellos no funcionaba en Windows 7. Después de todo lo que escribo un método sencillo para hacerlo.

private void GoFullscreen(bool fullscreen) 
    { 
     if (fullscreen) 
     { 
      this.WindowState = FormWindowState.Normal; 
      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
      this.Bounds = Screen.PrimaryScreen.Bounds; 
     } 
     else 
     { 
      this.WindowState = FormWindowState.Maximized; 
      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable; 
     } 
    } 

el orden de código es importante y no va a funcionar si cambia el lugar de WindwosState y FormBorderStyle.

Una de las ventajas de este método es dejar el TOPMOST en falso que permite que otros formularios pasen por encima del formulario principal.

Resolvió absolutamente mi problema.

Cuestiones relacionadas