2008-09-16 64 views
58

我有一个应用程序与其中的一种形式,并在Load方法我需要隐藏表单。单表隐藏在启动

当需要(想象一下Outlook 2003样式弹出窗口的行)时,窗体将显示自己,但是我可以'弄清楚如何隐藏加载时的窗体而不会杂乱无章。

有什么建议吗?

回答

95

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

在你的主程序文件,在Main方法中,你会碰到这样的:

Application.Run(new MainForm()); 

这将创建一个新的主要形式和应用的生命周期限制了对主窗体的寿命。

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

而不是在Load方法中隐藏窗体,使用设计器将窗体的Visible属性设置为False。你可以在调用Application.Run()之前创建表单,我假设表单上会有一个NotifyIcon来在任务栏中显示图标 - 即使表单本身还不可见,也可以显示该图标。

更新:您还需要将Application.ShutdownMode属性设置为ShutdownMode.OnExplicitShutdown。

+12

通过我所见过的最好的(也是最简单的)解决方案之一。 所有关于将不透明度设置为零的垃圾,具有单独的Timer实例来隐藏表单等,都有代码味道的天。 – nathanchere 2010-03-12 00:26:09

+0

使用这种方法,它仍然可以通过`Process.MainWindowHandle`等来找到吗? – Sebastian 2013-09-16 10:07:26

+12

据我所知,设计师没有可见财产。 – 2015-03-14 11:41:58

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

如果您不在Form1_Load中添加显示线,则无论如何显示窗体,即使您将可见性设置为false ... -1 – 2009-11-05 20:29:00

+0

-1这不起作用。 Application.Run()与你无关地显示表单。 – 2013-07-18 18:32:33

0

在设计时,窗体的Visible属性设置为false。然后避免调用Show()直到需要它。

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

0

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

将窗体关闭不可见是一个更好的选择。

29

我用这个:

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

很明显,你有你的改变,如果条件。

-1

为什么会这样呢?

为什么不只是像控制台应用程序一样启动并在必要时显示表单?除了少数引用将控制台应用程序与表单应用程序分开之外,没有什么可以做。

当你甚至不需要它时,不需要贪婪并为表单需要内存。

5

扩展您的主要形式有这样一条:

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/

-1

建议,我只需要这样做:

要隐藏形式:

Me.Opacity = 0 
Me.ShowInTaskbar = false 

要显示的形式:

Me.Opacity = 100 
Me.ShowInTaskbar = true 
79

通常,当您使用托盘图标或一些其他方法来显示你只会做这个之后的形式,但即使您从不显示主表单,它也会很好地工作。

创建窗体类布尔被默认为false:

private bool allowshowdisplay = false; 

然后重写SetVisibleCore方法

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

因为Application.Run()设置形式。可见= TRUE后它会加载这个会拦截的表单并将其设置为false。在上述情况下,它将始终将其设置为false,直到通过将allowhowdisplay设置为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;     
    } 
} 
10

在形式的施工时间(设计师,程序主,或窗体的构造,这取决于你的目标),

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属性或显示/隐藏方法。

0

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

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

     base.OnLoad(e); 
    } 
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; 
} 
-2

我不喜欢这样 - 从我的观点来看,最简单的方法:

设置窗体的“中StartPosition”并将其添加到表单的设计器中:

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

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

2

您将要设置窗口状态为最小化,并在任务栏中显示为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; 
    } 
3

试图隐藏从任务栏中的应用程序也是如此。

要做到这一点,请使用此代码。

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

    base.OnLoad(e); 
    } 

谢谢。 Ruhul

0

这完美的作品对我来说:

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

当我启动这个项目,一切都被隐藏,包括任务栏,除非我需要表现出来..

0

覆盖表格

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