启动时单个表单隐藏

时间:2008-09-16 08:10:54

标签: c# vb.net winforms

我有一个带有一个表单的应用程序,在Load方法中我需要隐藏表单。

表单会在需要时显示自己(按照outlook 2003样式弹出框的思路),但我可以“弄清楚如何在没有杂乱的情况下隐藏表单。”

有什么建议吗?

23 个答案:

答案 0 :(得分:105)

我是从C#来的,但在vb.net中应该非常相似。

在主程序文件中,在Main方法中,您将有类似的内容:

Application.Run(new MainForm());

这会创建一个新的主窗体,并将应用程序的生命周期限制为主窗体的生命周期。

但是,如果您将参数移除到Application.Run(),那么应用程序将以未显示的形式启动,您可以随意显示和隐藏表单。

不是将表单隐藏在Load方法中,而是在调用Application.Run()之前初始化表单。我假设表单上会有一个NotifyIcon来在任务栏中显示一个图标 - 即使表单本身尚未显示,也可以显示该图标。从NotifyIcon事件处理程序中调用Form.Show()Form.Hide()将分别显示和隐藏表单。

答案 1 :(得分:91)

通常情况下,当您使用托盘图标或其他方法稍后显示表单时,您才会这样做,但即使您从未显示主表单,它也能很好地工作。

在Form类中创建一个默认为false的bool:

private bool allowshowdisplay = false;

然后覆盖SetVisibleCore方法

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

因为Application.Run()在加载表单后设置表单.Visible = true,这将拦截它并将其设置为false。在上面的例子中,它将始终设置为false,直到您通过将allowshowdisplay设置为true来启用它。

现在,这将使表单不会在启动时显示,现在您需要通过设置allowshowdisplay = true来重新启用SetVisibleCore以使其正常运行。您将希望在显示表单的任何用户界面功能上执行此操作。在我的例子中,它是我的notiyicon对象中的左键单击事件:

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

答案 2 :(得分:33)

我用这个:

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

显然你必须改变你的if条件。

答案 3 :(得分:18)

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

        base.OnLoad(e);
    }

答案 4 :(得分:14)

在表单构建时(Designer,程序Main或Form构造函数,取决于您的目标),

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

当您需要显示表单时,可能是来自NotifyIcon的事件,必要时反向,

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

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

连续显示/隐藏事件可以更简单地使用Form的Visible属性或Show / Hide方法。

答案 5 :(得分:5)

尝试从任务栏中隐藏应用程序。

为此,请使用此代码。

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

   base.OnLoad(e);
   }

感谢。  Ruhul

答案 6 :(得分:4)

使用以下内容扩展您的主表单:

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);
        }
    }
}

例如:

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

本文中的更多信息(西班牙文):

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

答案 7 :(得分:3)

您希望将窗口状态设置为最小化,并在任务栏中显示为false。然后在表单的末尾加载设置窗口状态为最大化并在任务栏中显示为真

    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;
    }

答案 8 :(得分:3)

我一直在努力解决这个问题,但解决方案比我简单得多。 我首先尝试了所有的建议,但后来我对结果不满意,并对它进行了一些调查。 我发现如果我添加:

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

工作得很好。 但我想要一个更简单的解决方案,结果是如果你添加:

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;
}

答案 9 :(得分:2)

将其放在您的Program.cs中:

FormName FormName = new FormName ();

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

要显示表单时,请使用此选项:

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

答案 10 :(得分:1)

在表单

中覆盖OnVisibleChanged
String.IndexOf

如果您需要在某个时间点显示触发器,可以添加触发器

String.SubString

答案 11 :(得分:0)

    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();
        }

答案 12 :(得分:0)

这是一个简单的方法:
它在C#中(我目前没有VB编译器)

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;
}

答案 13 :(得分:0)

我遇到了一个与发布者类似的问题,即在完全完成表单加载之前触发了在form_Load事件中隐藏表单的代码,从而使Hide()方法失败(不会崩溃,只是没有按预期工作) )。

其他答案很好用,但我发现一般来说,form_Load事件通常会遇到这样的问题,您想要放入其中的内容可以轻松地放入构造函数或form_Shown事件中。

无论如何,当我移动相同的代码来检查某些事情然后在不需要表单时隐藏表单(单点登录失败时的登录表单),表单就可以正常工作了。

答案 14 :(得分:0)

这对我很有用:

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

当我启动项目时,所有内容都被隐藏,包括在任务栏中,除非我需要显示它..

答案 15 :(得分:0)

作为Groky's response的补充(在我看来,这实际上是迄今为止最好的反应)我们还可以提到ApplicationContext类,它也允许(如文章中的示例所示)能够在应用程序启动时打开两个(甚至更多)表单,并使用所有表单控制应用程序的生命周期。

答案 16 :(得分:0)

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

答案 17 :(得分:0)

此示例支持完全不可见性以及系统托盘中的NotifyIcon,没有点击次数等等。

更多信息:http://code.msdn.microsoft.com/TheNotifyIconExample

答案 18 :(得分:0)

启动没有表单的应用程序意味着您将不得不自己管理应用程序启动/关闭。

启动表格不可见是一个更好的选择。

答案 19 :(得分:-1)

在设计器中,将窗体的Visible属性设置为false。然后避免在需要之前调用Show()。

更好的范例是在您需要之前不创建表单实例。

答案 20 :(得分:-2)

我是这样做的 - 从我的观点来看最简单的方法:

将表单的'StartPosition'设置为'Manual',并将其添加到表单的设计器中:

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

确保将位置设置为超出或低于屏幕尺寸的位置。稍后,当您想要显示表单时,请将位置设置为屏幕尺寸内的某个位置。

答案 21 :(得分:-2)

基于各种建议,我所要做的就是:

隐藏表单:

Me.Opacity = 0
Me.ShowInTaskbar = false

显示表格:

Me.Opacity = 100
Me.ShowInTaskbar = true

答案 22 :(得分:-2)

为什么这样呢?

为什么不像控制台应用程序一样启动并在必要时显示表单?除了一些引用将控制台应用程序与表单应用程序分开之外,别无其他。

当你甚至不需要时,不需要贪婪并占用表格所需的记忆。