it-swarm-pt.tech

Ocultar formulário único na inicialização

Eu tenho um aplicativo com um formulário e, no método Load, preciso ocultar o formulário.

O formulário será exibido quando for necessário (pense nas linhas de um pop-up no estilo do Outlook 2003), mas eu posso descobrir como ocultar o formulário no carregamento sem algo bagunçado.

Alguma sugestão?

72
Pondidum

Estou chegando a partir de c #, mas deve ser muito semelhante em vb.net.

No seu arquivo de programa principal, no método Main, você terá algo como:

Application.Run(new MainForm());

Isso cria um novo formulário principal e limita a vida útil do aplicativo à vida útil do formulário principal.

No entanto, se você remover o parâmetro para Application.Run (), o aplicativo será iniciado sem nenhum formulário mostrado e você poderá mostrar e ocultar os formulários o quanto quiser.

Em vez de ocultar o formulário no método Load, inicialize o formulário antes de chamar Application.Run (). Estou assumindo que o formulário terá um NotifyIcon nele para exibir um ícone na barra de tarefas - isso pode ser exibido mesmo se o próprio formulário ainda não estiver visível. Chamar Form.Show() ou Form.Hide() de manipuladores de eventos NotifyIcon mostrará e ocultará o formulário, respectivamente.

108
Grokys

Normalmente, você só faria isso quando estiver usando um ícone de bandeja ou algum outro método para exibir o formulário posteriormente, mas ele funcionará bem, mesmo que você nunca exiba seu formulário principal.

Crie um bool na classe Form que tenha como padrão false:

private bool allowshowdisplay = false;

Em seguida, substitua o método SetVisibleCore

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

Como Application.Run () define os formulários .Visible = true após carregar o formulário, isso irá interceptar isso e definir como false. No caso acima, ele sempre será definido como falso até você ativá-lo, definindo allowhowdisplay como true.

Agora que impedirá a exibição do formulário na inicialização, agora você precisará reativar o SetVisibleCore para funcionar corretamente, definindo o allowhowdisplay = true. Você desejará fazer isso em qualquer função da interface do usuário que exiba o formulário. No meu exemplo, é o evento de clique esquerdo no meu 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;                
    }
}
94
Paul Aicher

Eu uso isso:

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

Obviamente, você deve alterar a condição if com a sua.

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

        base.OnLoad(e);
    }
19
Chriz

No momento da construção do formulário (Designer, programa Principal ou construtor de Formulário, dependendo de seus objetivos),

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

Quando você precisar exibir o formulário, presumivelmente no evento do seu NotifyIcon, inverta conforme necessário,

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

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

Eventos de mostrar/ocultar sucessivos podem simplesmente usar a propriedade Visible do formulário ou os métodos Show/Hide.

14
Jeff

Tente ocultar o aplicativo também da barra de tarefas.

Para fazer isso, use este código.

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

   base.OnLoad(e);
   }

Obrigado. Ruhul

5
Metallic Skeleton

Eu lutei muito com esse problema e a solução é muito mais simples do que eu imaginava. Eu tentei todas as sugestões aqui primeiro, mas depois não fiquei satisfeito com o resultado e o investiguei um pouco mais. Descobri que se eu adicionar o:

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

Está funcionando muito bem. mas eu queria uma solução mais simples e, se você adicionar o:

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

Você deseja definir o estado da janela como minimizado e mostrar na barra de tarefas como falso. Em seguida, no final de seus formulários, carregue o estado da janela definida como maximizado e mostre na barra de tarefas como verdadeiro

    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

Coloque isso no seu Program.cs:

FormName FormName = new FormName ();

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

Use isso quando desejar exibir o formulário:

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

Substituir OnVisibleChanged no formulário

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

    base.OnVisibleChanged(e);
}

Você pode adicionar um gatilho se precisar mostrá-lo em algum 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

Isso funciona perfeitamente para mim:

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

Quando inicio o projeto, tudo estava oculto, inclusive na barra de tarefas, a menos que eu precise mostrá-lo.

0
Willy David Jr

Iniciar um aplicativo sem um formulário significa que você precisará gerenciar a inicialização/desligamento do aplicativo.

Iniciar o formulário invisível é uma opção melhor.

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

Aqui está uma abordagem simples:
Está em C # (não tenho o compilador VB no 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
    static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form1 = new Form1();
            form1.Visible = false;
            Application.Run();

        }
 private void ExitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
            Application.Exit();
        }
0
Muhammad Rashed Nadeem

Eu tive um problema semelhante ao do pôster em que o código para ocultar o formulário no evento form_Load era acionado antes do carregamento completo do formulário, fazendo com que o método Hide () falhasse (sem travar, apenas não estava funcionando como esperado).

As outras respostas são ótimas e funcionam, mas eu descobri que, em geral, o evento form_Load geralmente apresenta esses problemas e o que você deseja incluir pode facilmente ir no construtor ou no evento form_Shown.

De qualquer forma, quando movi o mesmo código que verifica algumas coisas, oculta o formulário quando não é necessário (um formulário de logon quando o logon único falha), ele funciona como esperado.

0
blind Skwirl

Este exemplo suporta a invisibilidade total, além de apenas o NotifyIcon na bandeja do sistema, sem cliques e muito mais.

Mais aqui: http://code.msdn.Microsoft.com/TheNotifyIconExample

0
TheUberOverLord

Como um complemento para resposta de Groky (que na verdade é a melhor resposta de longe na minha perspectiva), também podemos mencionar a classe ApplicationContext , que também permite (como é mostrado no exemplo do artigo), a capacidade de abrir dois (ou até mais) formulários na inicialização do aplicativo e controlar o tempo de vida do aplicativo com todos eles.

0
Eugenio Miró