it-swarm.cn

启动时单个表单隐藏

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

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

有什么建议?

69
Pondidum

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

在主程序文件中,在Main方法中,您将具有以下内容:

Application.Run(new MainForm());

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

但是,如果将参数移除到Application.Run(),则应用程序将在没有显示任何表单的情况下启动,您可以随意显示和隐藏表单。

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

105
Grokys

通常,当您使用托盘图标或其他方法稍后显示表单时,您只会执行此操作,但即使您从未显示主表单,它也能很好地工作。

在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;                
    }
}
91
Paul Aicher

我用这个:

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

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

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

在表单构造时(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方法。

14
Jeff

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

为此,请使用此代码。

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

   base.OnLoad(e);
   }

谢谢。 Ruhul

5
Metallic Skeleton

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

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

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

    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

在窗体中覆盖OnVisibleChanged

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

    base.OnVisibleChanged(e);
}

如果您可能需要在某个时刻显示它,可以添加触发器

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

把它放在你的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();
1
Ben Yousaf

这对我很有用:

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

当我启动项目时,一切都被隐藏,包括在任务栏中,除非我需要显示它。

0
Willy David Jr

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

启动隐形表单是一个更好的选择。

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

这是一个简单的方法:
它在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;
}
0
aku

我有一个类似于海报的问题,其中隐藏form_Load事件中的表单的代码在表单完全加载之前被触发,使得Hide()方法失败(没有崩溃,只是没有按预期工作)。

其他答案很棒并且有效但我发现一般来说,form_Load事件经常会出现这样的问题,而你想要放在那里的东西很容易进入构造函数或form_Shown事件。

无论如何,当我移动相同的代码来检查某些内容然后在不需要时隐藏表单(单点登录失败时的登录表单),它按预期工作。

0
blind Skwirl

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

更多这里: http://code.msdn.Microsoft.com/TheNotifyIconExample

0
TheUberOverLord

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

0
Eugenio Miró