English 中文(简体)
启动时隐藏单个窗体
原标题:
  • 时间:2008-09-16 08:10:53
  •  标签:

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

表单会在需要时显示自己(按照outlook2003风格的弹出窗口来思考),但我可以找到如何在加载时隐藏表单而不会出现混乱。

有什么建议吗?

最佳回答

我是从C#开始了解这一点的,但在vb.net中应该非常相似。

在您的主程序文件中,在main方法中,您将得到如下内容:

Application.Run(new MainForm());

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

但是,如果删除Application.Run()的参数,那么应用程序将在不显示表单的情况下启动,并且您可以随心所欲地显示和隐藏表单。

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

问题回答

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

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

private bool allowshowdisplay = false;

然后重写SetVisibleCore方法

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

因为Application.Run()在加载表单后设置forms.Visible=true,所以它将截取该表单并将其设置为false。在上述情况下,它将始终将其设置为false,直到您通过将allowshowdisplay设置为true来启用它。

现在,这将阻止表单在启动时显示,现在您需要通过设置allowshowdisplay=true来重新启用SetVisibleCore以正常工作。您将希望在显示表单的任何用户界面函数上执行此操作。在我的示例中,它是notyicon对象中的左键单击事件:

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

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

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

当您需要显示表单时,大概是在NotifyIcon的事件上,根据需要反转,

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

 if (this.WindowState == FormWindowState.Minimized)
    this.WindowState = FormWindowState.Normal;

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

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

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

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

   base.OnLoad(e);
   }

Thanks. Ruhul

用这个扩展你的主窗体:

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/

I have struggled with this issue a lot and the solution is much simpler than i though. I first tried all the suggestions here but then i was not satisfied with the result and investigated it a little more. I found that if I add the:

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

It is working just fine. but I wanted a more simple solution and it turn out that if you add the:

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

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

把这个放在你的程序.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();

这非常适合我:

[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);
    }
...
}

启动一个没有表单的应用程序意味着你必须自己管理应用程序的启动/关闭。

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

此示例支持完全不可见,并且在系统托盘中只支持NotifyIcon,不支持单击等等。

更多信息请点击此处:http://code.msdn.microsoft.com/TheNotifyIconExample

作为Groky的回应(在我看来,这实际上是迄今为止最好的回应)我们也可以提到ApplicationContext类,它还允许(如文章的示例所示)在应用程序启动时打开两个(甚至更多)表单,并使用所有表单控制应用程序的生存期。

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

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

其他答案都很好,也很有效,但我发现,通常情况下,form_Load事件经常会出现这样的问题,并且您想在其中放入的内容可以很容易地放入构造函数或form_Shown事件中。

无论如何,当我移动相同的代码来检查一些东西,然后在不需要时隐藏表单(当单次登录失败时是登录表单)时,它就如预期的那样工作了。

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

Here is a simple approach:
It s in C# (I don t have VB compiler at the moment)

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

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

一个更好的范例是在您需要之前不要创建表单的实例。

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

要隐藏表单,请执行以下操作:

Me.Opacity = 0
Me.ShowInTaskbar = false

要显示表单,请执行以下操作:

Me.Opacity = 100
Me.ShowInTaskbar = true




相关问题
热门标签