启动时隐藏单一表单

Posted

技术标签:

【中文标题】启动时隐藏单一表单【英文标题】:Single Form Hide on Startup 【发布时间】:2010-09-09 08:59:55 【问题描述】:

我有一个包含一个表单的应用程序,在 Load 方法上我需要隐藏表单。

表单会在需要时自行显示(按照 Outlook 2003 样式弹出窗口的思路思考),但我不知道如何在加载时隐藏表单而不会造成混乱。

有什么建议吗?

【问题讨论】:

【参考方案1】:
    static void Main()
        
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form1 = new Form1();
            form1.Visible = false;
            Application.Run();

        
 private void ExitToolStripMenuItem_Click(object sender, EventArgs e)
        
            this.Close();
            Application.Exit();
        

【讨论】:

【参考方案2】:

我遇到了与发帖者类似的问题,其中在表单完全加载完成之前触发了在 form_Load 事件中隐藏表单的代码,导致 Hide() 方法失败(没有崩溃,只是没有按预期工作)。

其他答案很好并且有效,但我发现一般来说,form_Load 事件经常存在此类问题,您想要放入其中的内容可以轻松进入构造函数或 form_Shown 事件。

无论如何,当我移动检查某些内容的相同代码然后在不需要时隐藏表单(单点登录失败时的登录表单)时,它按预期工作。

【讨论】:

【参考方案3】:

把它放在你的 Program.cs 中:

FormName FormName = new FormName ();

FormName.ShowInTaskbar = false;
FormName.Opacity = 0;
FormName.Show();
FormName.Hide();

当你想显示表单时使用这个:

var principalForm = Application.OpenForms.OfType<FormName>().Single();
principalForm.ShowInTaskbar = true;
principalForm.Opacity = 100;
principalForm.Show();

【讨论】:

【参考方案4】:

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

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

Application.Run(new MainForm());

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

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

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

【讨论】:

迄今为止我见过的最好的(也是最简单的)解决方案之一。所有关于将不透明度设置为零、使用单独的 Timer 实例来隐藏表单等的垃圾都有几天的代码气味。 据我所知,设计师没有 Visible 属性。 此处是 Visual Studio 2015 和 .NET 4.5... Designer 没有表单的 visible 属性。我忽略了什么吗? 如果我错了,请纠正我,Application.Run 为进程提供了 Windows 窗体所需的消息循环。没有它,表单中的代码就会崩溃。 请注意,在这种情况下,Form_Load 将在表单首次显示之前不会被调用。而且可能永远不会。关闭主窗体也不会关闭应用程序。你必须使用Application.Exit【参考方案5】:

覆盖表单中的 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);
    
...

【讨论】:

【参考方案6】:

这对我来说非常适合:

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

当我启动项目时,一切都被隐藏了,包括在任务栏中,除非我需要显示它..

【讨论】:

【参考方案7】:

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

为此,请使用此代码。

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

   base.OnLoad(e);
   

谢谢。 鲁胡尔

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

我这样做 - 从我的角度来看最简单的方法:

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

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

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

【讨论】:

【参考方案10】:
static void Main()

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    MainUIForm mainUiForm = new MainUIForm();
    mainUiForm.Visible = false;
    Application.Run();

【讨论】:

【参考方案11】:

我一直在努力解决这个问题,但解决方案比我简单得多。 我首先在这里尝试了所有建议,但后来我对结果不满意并对其进行了更多调查。 我发现如果我添加:

 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;

【讨论】:

【参考方案12】:
    protected override void OnLoad(EventArgs e)
    
        Visible = false; // Hide form window.
        ShowInTaskbar = false; // Remove from taskbar.
        Opacity = 0;

        base.OnLoad(e);
    

【讨论】:

我希望我的表单被隐藏但仍然加载并运行。该解决方案在这种情况下非常有效。为你点赞! 我认为这是最好的解决方案,THX :)【参考方案13】:

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

【讨论】:

【参考方案14】:

在表单构建时(设计器、程序主程序或表单构造器,取决于您的目标),

 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 方法。

【讨论】:

这也适用于 Load 事件。我认为这就是它的本意。【参考方案15】:

通常您只会在稍后使用托盘图标或其他方法显示表单时才这样做,但即使您从不显示主表单,它也会很好地工作。

在您的 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,直到您通过将 allowhowdisplay 设置为 true 来启用它。

现在这将使表单在启动时不显示,现在您需要通过设置 allowhowdisplay = 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;                
    

【讨论】:

谢谢!与此处几乎所有其他建议不同,此建议不会显示主窗口的短暂闪烁。 这是执行此操作的实际正确方法,因此它应该是公认的答案。在 MFC 时代,我们曾经做过类似的事情,我们会处理第一个 WM_WINDOWPOSCHANGING 消息并在那里隐藏表单以防止“窗口闪烁”。 谢谢我尝试了接受的答案,但它没有工作,因为我需要显示一个托盘图标,但是这个工作完美。 这行得通,但我认为@Jeff 的答案更好,因为它不需要通过一些逻辑黑客来覆盖。 不幸的是,当我将 SetVisibleCore() 方法添加到表单时,通知图标根本没有出现,所以之后我无法通过鼠标单击来显示它。【参考方案16】:

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

隐藏表单:

Me.Opacity = 0
Me.ShowInTaskbar = false

显示表格:

Me.Opacity = 100
Me.ShowInTaskbar = true

【讨论】:

如果用户不小心按了 Enter 键或在透明区域输入了怎么办?我认为你也应该这样做 Me.Enable = false;【参考方案17】:

用这个扩展你的主表单:

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/

【讨论】:

【参考方案18】:

为什么会这样?

为什么不像控制台应用一样开始并在必要时显示表单?除了一些将控制台应用程序与表单应用程序分开的参考资料外,别无其他。

当您甚至可能不需要时,无需贪婪并占用表单所需的内存。

【讨论】:

【参考方案19】:

此示例支持完全不可见以及仅系统托盘中的 NotifyIcon 和无点击等等。

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

【讨论】:

很遗憾,这个内容已经不存在了:/【参考方案20】:

我用这个:

private void MainForm_Load(object sender, EventArgs e)

    if (Settings.Instance.HideAtStartup)
    
        BeginInvoke(new MethodInvoker(delegate
        
            Hide();
        ));
    

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

【讨论】:

这会导致程序闪烁,然后在启动时快速隐藏。 如果我看不到你的代码,我想我应该做这么多。谢谢 为了解决应用程序启动时的flash,在设计器中将Form Opacity设置为0,然后在回调中,先调用Hide(),然后将Opacity设置回100。【参考方案21】:

在没有表单的情况下启动应用意味着您必须自己管理应用的启动/关闭。

让表单不可见是一个更好的选择。

【讨论】:

【参考方案22】:

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

【讨论】:

如果你没有在Form1_Load中添加Show Line,即使你将visible设置为false,表单仍然会显示... -1 -1 这不起作用。 Application.Run() 无论如何都与您合谋显示表单。【参考方案23】:

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

更好的范例是在需要时才创建表单实例。

【讨论】:

以上是关于启动时隐藏单一表单的主要内容,如果未能解决你的问题,请参考以下文章

我的应用程序是手动启动的吗?

OS X - 如何检测应用程序何时在登录时以隐藏状态启动?

拨打密码时启动隐藏的应用程序

启动片段时隐藏ActionBar

如何隐藏 excel 表单

启动时无法隐藏状态栏