启动时单窗体隐藏

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

当需要(想象一下Outlook 2003样式的popup窗口)的时候,表单会显示出来,但是我可以弄清楚如何在没有任何杂乱的情况下隐藏表单。

有什么build议么?

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

在主程序文件中,在Main方法中,您将拥有如下所示的内容:

Application.Run(new MainForm()); 

这将创build一个新的主表单,并将应用程序的生命周期限制在主表单的生命周期中。

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

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

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

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

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

 private bool allowshowdisplay = false; 

然后重写SetVisibleCore方法

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

因为Application.Run()在加载表单后设置表单.Visible = 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; } } 

我使用这个:

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

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

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

在表单构build时(devise器,程序主或表单构造器,根据您的目标),

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

当您需要显示表单时,大概是来自NotifyIcon的事件,必要时反转,

  if (!this.ShowInTaskbar) this.ShowInTaskbar = true; if (this.WindowState == FormWindowState.Minimized) this.WindowState = FormWindowState.Normal; 

连续的显示/隐藏事件可以更简单地使用窗体的可见性属性或显示/隐藏方法。

用这个扩展主窗体:

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

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

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

我一直在努力解决这个问题,解决scheme比我简单得多。 我在这里首先尝试了所有的build议,但是结果并不满意,并且调查了一下。 我发现如果我添加:

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

它工作得很好。 但我想要一个更简单的解决scheme,事实certificate,如果你添加:

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

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

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

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

谢谢。 Ruhul

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

在devise器中,将窗体的Visible属性设置为false。 然后避免调用Show()直到你需要它。

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

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

启动一个没有表单的应用意味着你将不得不自己pipe理应用程序的启动/closures。

从不可见的forms开始是一个更好的select。

这个例子支持全部隐身function以及系统托盘中只有NotifyIcon,没有点击等等。

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

作为Groky响应的补充(实际上是我认为的最好的响应),我们还可以提到ApplicationContext类,它也允许(如文章示例中所示)打开两个(或更多)Forms在应用程序启动时,使用它们全部来控制应用程序的生命周期。

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

这对我来说是完美的:

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

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

在窗体中重写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); } ... } 

为什么这样呢?

为什么不只是开始像一个控制台应用程序,并在必要时显示表格? 没有什么,但有几个引用将控制台应用程序与表单应用程序分开。

当你甚至不需要时,不需要贪婪和为表单所需要的内存。

根据各种build议,我所要做的就是:

隐藏表单:

 Me.Opacity = 0 Me.ShowInTaskbar = false 

显示表格:

 Me.Opacity = 100 Me.ShowInTaskbar = true 

我这样做 – 从我的angular度来看,最简单的方法是:

将表单的“StartPosition”设置为“Manual”,并将其添加到表单的devise器中:

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

确保位置设置为超出或低于屏幕尺寸。 之后,如果要显示表单,请将位置设置为屏幕尺寸内的某个位置。