it-swarm-es.tech

Forma única de ocultar en el inicio

Tengo una aplicación con un formulario en ella, y en el método de carga necesito ocultar el formulario.

El formulario se mostrará cuando sea necesario (piense a lo largo de las líneas de una ventana emergente de estilo de Outlook 2003), pero no puedo averiguar cómo ocultar el formulario en carga sin algo desordenado.

¿Alguna sugerencia?

70
Pondidum

Estoy llegando a esto desde C #, pero debería ser muy similar en vb.net.

En su archivo de programa principal, en el método Principal, tendrá algo como:

Application.Run(new MainForm());

Esto crea una nueva forma principal y limita la vida útil de la aplicación a la vida útil de la forma principal.

Sin embargo, si elimina el parámetro a Application.Run (), la aplicación se iniciará sin mostrar el formulario y tendrá la libertad de mostrar y ocultar los formularios todo lo que desee.

En lugar de ocultar el formulario en el método de carga, inicialícelo antes de llamar a Application.Run (). Supongo que el formulario tendrá un NotifyIcon para mostrar un icono en la barra de tareas; esto se puede mostrar incluso si el formulario en sí aún no está visible. Al llamar a Form.Show() o Form.Hide() desde los manejadores de eventos NotifyIcon se mostrará y ocultará el formulario respectivamente.

106
Grokys

Por lo general, solo estará haciendo esto cuando use el ícono de la bandeja o algún otro método para mostrar el formulario más adelante, pero funcionará bien incluso si nunca muestra el formulario principal.

Cree un bool en su clase de formulario que está predeterminado a falso:

private bool allowshowdisplay = false;

Luego anula el método SetVisibleCore

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

Debido a que Application.Run () establece los formularios .Visible = true después de cargar el formulario, esto lo interceptará y lo configurará como falso. En el caso anterior, siempre lo establecerá en falso hasta que lo habilite configurando el modo de mostrar la visualización en verdadero.

Ahora eso evitará que el formulario se muestre en el inicio, ahora debe volver a habilitar el SetVisibleCore para que funcione correctamente configurando el allowhowdisplay = 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;                
    }
}
91
Paul Aicher

Yo uso esto:

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

Obviamente tienes que cambiar la condición if con la tuya.

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

        base.OnLoad(e);
    }
18
Chriz

En el momento de la construcción del formulario (diseñador, programa principal o constructor de formularios, según sus objetivos),

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

Cuando necesite mostrar el formulario, presumiblemente en el evento de su NotifyIcon, invierta según sea necesario,

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

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

Los sucesivos eventos de mostrar/ocultar pueden más simplemente utilizar la propiedad Visible del formulario o los métodos Mostrar/Ocultar.

14
Jeff

Trate de ocultar la aplicación de la barra de tareas también.

Para hacer eso por favor usa 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

5
Metallic Skeleton

He luchado mucho con este problema y la solución es mucho más sencilla que yo. Primero probé todas las sugerencias aquí, pero luego no estaba satisfecho con el resultado y lo investigué un poco más. Encontré que si agrego el:

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

Está funcionando bien. pero quería una solución más simple y resulta 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;
}
3
echoen

Vas a querer establecer el estado de la ventana en minimizado, y mostrarlo en la barra de tareas en falso. Luego, al final de sus formularios, cargue el estado de la ventana de conjunto para maximizar y muestre en la barra de tareas a verdadero

    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
George

Pon esto en tu Program.cs:

FormName FormName = new FormName ();

FormName.ShowInTaskbar = false;
FormName.Opacity = 0;
FormName.Show();
FormName.Hide();

Use esto cuando quiera mostrar el formulario:

var principalForm = Application.OpenForms.OfType<FormName>().Single();
principalForm.ShowInTaskbar = true;
principalForm.Opacity = 100;
principalForm.Show();
3
Ben Yousaf

Anular OnVisibleChanged en la forma

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

    base.OnVisibleChanged(e);
}

Puedes agregar disparador si es necesario que lo muestres 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);
    }
...
}
1
LKane

Esto funciona perfectamente para mi:

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

Cuando lanzo el proyecto, todo estaba oculto, incluso en la barra de tareas, a menos que tenga que mostrarlo.

0
Willy David Jr

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

Comenzar el formulario de invisible es una mejor opción.

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

Aquí hay un enfoque simple:
Está en C # (no tengo VB compilador en este 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
aku

Tuve un problema similar al del póster donde el código para ocultar el formulario en el evento form_Lad fue disparado antes de que el formulario se completara por completo, lo que provocó que el método Hide () fallara (no se bloquee, simplemente no funcionó como se esperaba).

Las otras respuestas son excelentes y funcionan, pero he encontrado que, en general, el evento form_Load suele tener problemas de este tipo y lo que usted quiere colocar allí puede ir fácilmente al constructor o al evento form_Shown.

De todos modos, cuando moví ese mismo código que comprueba algunas cosas, luego oculta el formulario cuando no es necesario (un formulario de inicio de sesión cuando falla el inicio de sesión único), funcionó como se esperaba.

0
blind Skwirl

Este ejemplo admite la invisibilidad total y solo NotifyIcon en la bandeja del sistema, sin clics y mucho más.

Más aquí: http://code.msdn.Microsoft.com/TheNotifyIconExample

0
TheUberOverLord

Como complemento de la respuesta de Groky (que en realidad es la mejor respuesta en mi perspectiva) también podemos mencionar el ApplicationContext class, que también permite (como se muestra en la muestra del artículo ) la capacidad de abrir dos (o incluso más) Formularios en el inicio de la aplicación, y controlar la duración de la aplicación con todos ellos.

0
Eugenio Miró