启动时单窗体隐藏
我有一个应用程序在其中的一种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牙文):
我一直在努力解决这个问题,解决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
确保位置设置为超出或低于屏幕尺寸。 之后,如果要显示表单,请将位置设置为屏幕尺寸内的某个位置。