启动时单个表单隐藏

Pon*_*dum 72 c# vb.net winforms

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

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

有什么建议?

Gro*_*kys 108

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

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

Application.Run(new MainForm());
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 据我所见,设计师没有Visible属性. (13认同)
  • 到目前为止,我见过的最好(也是最简单的)解决方案.关于将不透明度设置为零,具有单独的Timer实例以隐藏表单等的所有垃圾都有几天的代码味道. (12认同)
  • Visual Studio 2015和.NET 4.5在这里...... Designer没有表单的"visible"属性.我忽略了什么吗? (5认同)
  • 为什么会有这么多的赞成?它根本不起作用 (3认同)
  • 请注意,在这种情况下,在第一次显示表单之前不会调用“Form_Load”。并且可能永远不会。关闭主窗体也不会关闭应用程序。您必须使用“Application.Exit”。 (2认同)

小智 99

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

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

private bool allowshowdisplay = false;
Run Code Online (Sandbox Code Playgroud)

然后重写SetVisibleCore方法

protected override void SetVisibleCore(bool value)
{            
    base.SetVisibleCore(allowshowdisplay ? value : allowshowdisplay);
}
Run Code Online (Sandbox Code Playgroud)

因为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;                
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!与这里几乎所有其他建议不同,该建议没有在主窗口中显示简短的闪烁。 (2认同)
  • 这是执行此操作的实际正确方法,因此应该是公认的答案。早在MFC时代,我们曾经做过类似的事情,即处理第一条WM_WINDOWPOSCHANGING消息并在其中隐藏表单以防止“窗口闪烁”。 (2认同)

Mat*_*ías 33

我用这个:

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

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

  • 这会导致程序闪烁,然后在启动时快速隐藏。 (2认同)

Chr*_*riz 19

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

        base.OnLoad(e);
    }
Run Code Online (Sandbox Code Playgroud)


小智 14

在表单构造时(Designer,程序Main或Form构造函数,取决于您的目标),

 this.WindowState = FormWindowState.Minimized;
 this.ShowInTaskbar = false;
Run Code Online (Sandbox Code Playgroud)

当您需要显示表单时,可能是来自NotifyIcon的事件,必要时反向,

 if (!this.ShowInTaskbar)
    this.ShowInTaskbar = true;

 if (this.WindowState == FormWindowState.Minimized)
    this.WindowState = FormWindowState.Normal;
Run Code Online (Sandbox Code Playgroud)

连续的显示/隐藏事件可以更简单地使用Form的Visible属性或Show/Hide方法.


小智 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

例如:

namespace HideWindows
{
    public partial class Form1 : HideForm
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


Met*_*ton 5

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

为此,请使用此代码。

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

   base.OnLoad(e);
   }
Run Code Online (Sandbox Code Playgroud)

谢谢。鲁胡尔