2008-09-16 17 views
58

Tengo una aplicación con un formulario, y en el método Load necesito ocultar el formulario.Single Form Hide on Startup

El formulario se mostrará solo cuando sea necesario (piense en las líneas de una ventana emergente de estilo de Outlook 2003), pero no puedo 'encontrar la manera de ocultar el formulario en la carga sin algo desordenado.

¿Alguna sugerencia?

Respuesta

95

Vengo de C#, pero debería ser muy similar en vb.net.

En el archivo principal del programa, en el procedimiento principal, que tendrá algo como:

Application.Run(new MainForm()); 

Esto crea un nuevo formulario principal y limita la vida útil de la aplicación a la vida de la forma principal.

Sin embargo, si elimina el parámetro a Application.Run(), la aplicación se iniciará sin mostrar ningún formulario y podrá mostrar y ocultar los formularios tanto como desee.

En lugar de ocultar el formulario en el método Cargar, establezca la propiedad Visible del formulario en False utilizando el diseñador. Puede crear el formulario antes de llamar a Application.Run(), supongo que el formulario tendrá NotifyIcon para mostrar un ícono en la barra de tareas, esto puede mostrarse incluso si el formulario no está visible.

Actualización: También deseará establecer la propiedad Application.ShutdownMode en ShutdownMode.OnExplicitShutdown.

+12

Por lejos, la mejor (y una de las soluciones más simples) que he visto. Toda la basura sobre el establecimiento de la opacidad a cero, tener instancias de temporizador separadas para ocultar el formulario, etc., tienen olor a código durante días. – nathanchere

+0

Usando este método, ¿todavía se encontrará con 'Process.MainWindowHandle' y similares? – Sebastian

+12

El diseñador no tiene una propiedad visible por lo que puedo ver. –

0

Aquí es un enfoque simple:
Es en C# (no tengo compilador de VB en el momento)

public Form1() 
{ 
    InitializeComponent(); 
    Hide(); // Also Visible = false can be used 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    Thread.Sleep(10000); 
    Show(); // Or visible = true; 
} 
+0

si no agrega la línea Mostrar en Form1_Load, el formulario se muestra de todos modos, incluso si establece visible a falso ... -1 –

+0

-1 Esto no funciona. Application.Run() conspira contra su para mostrar el formulario pase lo que pase. –

0

En el diseñador, establecer la propiedad Visible del formulario en false. Luego evite llamar a Show() hasta que lo necesite.

Un mejor paradigma es no crear una instancia del formulario hasta que lo necesite.

0

Lanzar una aplicación sin un formulario significa que usted tendrá que administrar el inicio/cierre de la aplicación usted mismo.

El inicio de la forma invisible es una mejor opción.

29

Puedo usar este:

private void MainForm_Load(object sender, EventArgs e) 
{ 
    if (Settings.Instance.HideAtStartup) 
    { 
     BeginInvoke(new MethodInvoker(delegate 
     { 
      Hide(); 
     })); 
    } 
} 

Obviamente usted tiene que cambiar la condición if con la suya.

+1

Esto hace que el programa parpadee y luego se oculte rápidamente al inicio. –

+0

Supongo que debería hacer mucho si no veo tu código. Gracias –

+0

Para abordar el flash en el inicio de la aplicación, establezca Opacidad del formulario en 0 en el diseñador, luego en la devolución de llamada, primero llame a Ocultar() y luego configure Opacidad en 100. El sitio web –

-1

¿por qué hacerlo así en absoluto?

¿Por qué no comenzar como una aplicación de consola y mostrar el formulario cuando sea necesario? No hay más que algunas referencias que separan una aplicación de consola de una aplicación de formularios.

No es necesario ser codicioso y tomar la memoria necesaria para el formulario cuando ni siquiera lo necesite.

5

ampliar su principal forma con éste:

using System.Windows.Forms; 

namespace HideWindows 
{ 
    public class HideForm : Form 
    { 
     public HideForm() 
     { 
      Opacity = 0; 
      ShowInTaskbar = false; 
     } 

     public new void Show() 
     { 
      Opacity = 100; 
      ShowInTaskbar = true; 

      Show(this); 
     } 
    } 
} 

Por ejemplo:

namespace HideWindows 
{ 
    public partial class Form1 : HideForm 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

Más información en este artículo (español):

http://codelogik.net/2008/12/30/primer-form-oculto/

+0

está fuera de servicio. –

-1

en base a varios sugerencias, todo lo que tenía que hacer era esto:

Para ocultar la forma:

Me.Opacity = 0 
Me.ShowInTaskbar = false 

Para mostrar la forma:

Me.Opacity = 100 
Me.ShowInTaskbar = true 
+0

¿Qué sucede si el usuario accidentalmente pulsa una tecla Intro o escribe en el área transparente? Creo que también debería hacer * Me.Enable = false; * –

0
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    MainUIForm mainUiForm = new MainUIForm(); 
    mainUiForm.Visible = false; 
    Application.Run(); 
} 
+0

Todavía muestra brevemente la ventana principal antes de cerrarla. – Andy

79

Por lo general, sólo se estaría haciendo esto cuando se utiliza un icono de la bandeja o algún otro método para mostrar la forma más tarde, pero funcionará muy bien incluso si nunca muestra su formulario principal.

Crear un bool en su clase de formulario que está por defecto en falso:

private bool allowshowdisplay = false; 

A continuación, reemplazar el método SetVisibleCore

protected override void SetVisibleCore(bool value) 
{    
    base.SetVisibleCore(allowshowdisplay ? value : allowshowdisplay); 
} 

Debido Application.Run() establece las formas .Visible = true después carga la forma en que esto interceptará eso y lo establecerá en falso. En el caso anterior, siempre lo configurará en falso hasta que lo habilite estableciendo allowshowdisplay en verdadero.

Ahora que mantendrá la forma de mostrar en el inicio, ahora tiene que volver a habilitar SetVisibleCore para que funcione correctamente configurando allowshowdisplay = true. Querrá hacer esto en cualquier función de interfaz de usuario que muestre el formulario. En mi ejemplo es el evento de clic izquierdo en mi objeto notiyicon:

private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
     this.allowshowdisplay = true; 
     this.Visible = !this.Visible;     
    } 
} 
+1

Gracias! A diferencia de casi todas las otras sugerencias aquí, esta NO muestra un breve destello de la ventana principal. – Andy

+0

Esta es la forma correcta de hacer esto, por lo que debe ser la respuesta aceptada. De vuelta en los días de MFC solíamos hacer algo similar donde manejamos el primer mensaje WM_WINDOWPOSCHANGING y escondemos el formulario allí para evitar el "parpadeo de la ventana". – enriquein

+0

Gracias, probé la respuesta aceptada y no funcionó ya que necesito mostrar un ícono de bandeja, sin embargo, funcionó perfectamente. –

10

A la hora del formulario de la construcción (diseñador, el programa principal, o el constructor de forma, dependiendo de sus objetivos),

this.WindowState = FormWindowState.Minimized; 
this.ShowInTaskbar = false; 

Cuando necesitan mostrar la forma, presumiblemente en el evento de su NotifyIcon, revertir si es necesario,

if (!this.ShowInTaskbar) 
    this.ShowInTaskbar = true; 

if (this.WindowState == FormWindowState.Minimized) 
    this.WindowState = FormWindowState.Normal; 

eventos sucesivos mostrar/ocultar más sencillo usar la propiedad Visible del formulario o Mostrar/Ocultar métodos.

+0

Esto también funciona en el evento Load. Creo que esta es la forma en que fue intencionado. –

0

Como complemento a Groky's response (que en realidad es la mejor respuesta por mucho en mi perspectiva) también podríamos mencionar la clase ApplicationContext, que también permite (como se muestra en la muestra del artículo) la capacidad de abrir dos (o incluso más) Formularios al inicio de la aplicación y controlar la vida útil de la aplicación con todos ellos.

15
protected override void OnLoad(EventArgs e) 
    { 
     Visible = false; // Hide form window. 
     ShowInTaskbar = false; // Remove from taskbar. 
     Opacity = 0; 

     base.OnLoad(e); 
    } 
+0

Quiero que mi formulario esté oculto PERO aún cargado y en ejecución. Esta solución funciona perfectamente en tal caso. ¡Voto a usted! –

3

He luchado mucho con este problema y la solución es mucho más simple de lo que pensaba. Primero probé todas las sugerencias aquí, pero luego no estaba satisfecho con el resultado y lo investigué un poco más. He descubierto que si añado el:

this.visible=false; 
/* to the InitializeComponent() code just before the */ 
this.Load += new System.EventHandler(this.DebugOnOff_Load); 

Se está trabajando muy bien. pero quería una solución más simple y resultar que si agrega el:

this.visible=false; 
/* to the start of the load event, you get a 
simple perfect working solution :) */ 
private void 
DebugOnOff_Load(object sender, EventArgs e) 
{ 
this.Visible = false; 
} 
-2

lo hago como esto - desde mi punto de vista, la manera más fácil:

set 'StartPosition' del formulario a 'Manual', y añadir esto a diseñador de la forma:

Private Sub InitializeComponent() 
. 
. 
. 
Me.Location=New Point(-2000,-2000) 
. 
. 
. 
End Sub 

Asegúrese de que la ubicación se establece en algo más allá o por debajo de las dimensiones de la pantalla. Más tarde, cuando desee mostrar el formulario, establezca la ubicación en algo dentro de las dimensiones de la pantalla.

2

Vas a querer establecer el estado de la ventana para minimizar, y mostrar en la barra de tareas a falso. Luego, al final de sus formas carga establecida estado de la ventana maximizada a y mostrar en la barra de tareas a la verdadera

public frmMain() 
    { 
     Program.MainForm = this; 
     InitializeComponent(); 

     this.WindowState = FormWindowState.Minimized; 
     this.ShowInTaskbar = false; 
    } 

private void frmMain_Load(object sender, EventArgs e) 
    { 
     //Do heavy things here 

     //At the end do this 
     this.WindowState = FormWindowState.Maximized; 
     this.ShowInTaskbar = true; 
    } 
3

tratar de ocultar la aplicación desde la barra de tareas también.

Para hacer eso, utilice este código.

protected override void OnLoad(EventArgs e) 
    { 
    Visible = false; // Hide form window. 
    ShowInTaskbar = false; // Remove from taskbar. 
    Opacity = 0; 

    base.OnLoad(e); 
    } 

Gracias. Ruhul

0

Esto funciona perfectamente para mí:

[STAThread] 
    static void Main() 
    { 
     try 
     { 
      frmBase frm = new frmBase();    
      Application.Run(); 
     } 

Cuando inicio del proyecto, todo lo que estaba oculto en particular en la barra de tareas a menos que necesite mostrarlo ..

0

Anulación OnVisibleChanged en el Formulario

protected override void OnVisibleChanged(EventArgs e) 
{ 
    this.Visible = false; 

    base.OnVisibleChanged(e); 
} 

Puede agregar el disparador si es necesario que lo muestre en algún momento

public partial class MainForm : Form 
{ 
public bool hideForm = true; 
... 
public MainForm (bool hideForm) 
    { 
     this.hideForm = hideForm; 
     InitializeComponent(); 
    } 
... 
protected override void OnVisibleChanged(EventArgs e) 
    { 
     if (this.hideForm) 
      this.Visible = false; 

     base.OnVisibleChanged(e); 
    } 
... 
}