我有一个带有一个表单的应用程序,在Load方法中我需要隐藏表单.
表单将在需要时显示自己(按照outlook 2003样式弹出框的思路),但我可以'弄清楚如何在没有杂乱的情况下隐藏表单.
有什么建议?
我是从C#来的,但在vb.net中应该非常相似.
在主程序文件中,在Main方法中,您将具有以下内容:
Application.Run(new MainForm());
这将创建一个新的主窗体,并将应用程序的生命周期限制为主窗体的生命周期.
但是,如果将参数移除到Application.Run(),则应用程序将在没有显示任何表单的情况下启动,您可以随意显示和隐藏表单.
而不是在Load方法中隐藏表单,而是在调用Application.Run()之前初始化表单.我假设表单上会有一个NotifyIcon来在任务栏中显示一个图标 - 即使表单本身尚未显示,也可以显示该图标.调用Form.Show()
或Form.Hide()
来自NotifyIcon事件的处理程序将分别显示和隐藏表单.
通常,当您使用托盘图标或其他方法稍后显示表单时,您只会执行此操作,但即使您从未显示主表单,它也能很好地工作.
在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; } }
我用这个:
private void MainForm_Load(object sender, EventArgs e) { if (Settings.Instance.HideAtStartup) { BeginInvoke(new MethodInvoker(delegate { Hide(); })); } }
显然你必须改变你的if条件.
protected override void OnLoad(EventArgs e) { Visible = false; // Hide form window. ShowInTaskbar = false; // Remove from taskbar. Opacity = 0; base.OnLoad(e); }
在表单构造时(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方法.
尝试也从任务栏隐藏该应用程序。
为此,请使用此代码。
protected override void OnLoad(EventArgs e) { Visible = false; // Hide form window. ShowInTaskbar = false; // Remove from taskbar. Opacity = 0; base.OnLoad(e); }
谢谢。鲁胡尔