代码之家  ›  专栏  ›  技术社区  ›  Pondidum

启动时隐藏单个窗体

  •  68
  • Pondidum  · 技术社区  · 17 年前

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

    当需要时,窗体将显示自己(按照Outlook 2003样式弹出窗口的行进行考虑),但我无法理解如何在加载时隐藏窗体,而不会出现混乱。

    有什么建议吗?

    21 回复  |  直到 6 年前
        1
  •  100
  •   Thick_propheT    7 年前

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

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

    Application.Run(new MainForm());
    

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

    但是,如果您删除application.run()的参数,那么应用程序将在没有显示任何表单的情况下启动,并且您可以随意显示和隐藏表单。

    在调用application.run()之前,不要将窗体隐藏在Load方法中,而是初始化窗体。我假设表单上会有一个notifyicon来在任务栏中显示一个图标-即使表单本身还不可见,也可以显示这个图标。打电话 Form.Show() Form.Hide() 来自notifyicon事件的处理程序将分别显示和隐藏窗体。

        2
  •  90
  •   Paul Aicher    14 年前

    通常,只有在以后使用托盘图标或其他方法显示窗体时,才能执行此操作,但即使从未显示主窗体,它也能很好地工作。

    在窗体类中创建默认为false的bool:

    private bool allowshowdisplay = false;
    

    然后重写setVisibleCore方法

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

    因为application.run()在加载表单后设置了form.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;                
        }
    }
    
        3
  •  32
  •   Tute    16 年前

    我用这个:

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

    显然,你必须改变你的条件。

        4
  •  18
  •   Chriz    13 年前
        protected override void OnLoad(EventArgs e)
        {
            Visible = false; // Hide form window.
            ShowInTaskbar = false; // Remove from taskbar.
            Opacity = 0;
    
            base.OnLoad(e);
        }
    
        5
  •  13
  •   Jeff    14 年前

    在表单构造时(根据您的目标,设计人员、程序主管或表单构造人员),

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

    当需要显示表单时,可能是在来自通知图标的事件中,根据需要反转,

     if (!this.ShowInTaskbar)
        this.ShowInTaskbar = true;
    
     if (this.WindowState == FormWindowState.Minimized)
        this.WindowState = FormWindowState.Normal;
    

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

        6
  •  4
  •       16 年前

    使用此表单扩展主表单:

    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/

        7
  •  4
  •   Metallic Skeleton    8 年前

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

    为此,请使用此代码。

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

    谢谢。 鲁赫

        8
  •  3
  •   Abdul Rahman Rodrigo    12 年前

    我在这个问题上挣扎了很多次,解决方法比我简单得多。 我首先尝试了这里所有的建议,但后来我对结果不满意,并调查了更多。 我发现如果我加上:

     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;
    }
    
        9
  •  3
  •   George    9 年前

    您将希望将窗口状态设置为最小化,并在任务栏中显示为false。然后在窗体末尾,将窗口状态设置为“最大化”,并在任务栏中显示为“真”。

        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;
        }
    
        10
  •  0
  •   deemer    17 年前

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

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

        11
  •  0
  •   aku    17 年前

    下面是一个简单的方法:
    它在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;
    }
    
        12
  •  0
  •   Roger Willcocks    17 年前

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

    从“不可见”开始表单是更好的选择。

        13
  •  0
  •   community wiki TheUberOverLord    16 年前

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

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

        14
  •  0
  •   Community CDub    8 年前

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

        15
  •  0
  •   j0k gauthamp    12 年前
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        MainUIForm mainUiForm = new MainUIForm();
        mainUiForm.Visible = false;
        Application.Run();
    }
    
        16
  •  0
  •   Willy David Jr    8 年前

    这对我来说非常有效:

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

    当我启动项目时,所有东西都被隐藏,包括在任务栏中,除非我需要显示它。

        17
  •  0
  •   LKane    8 年前

    覆盖窗体中的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);
        }
    ...
    }
    
        18
  •  0
  •   Ben Yousaf    6 年前

    把这个放在你的程序里。

    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();
    
        19
  •  -1
  •   Benjamin Autin Andrés Bonilla    16 年前

    为什么会这样?

    为什么不从一个控制台应用程序开始,在必要时显示表单?除了一些将控制台应用程序与表单应用程序分开的引用外,什么也没有。

    不需要贪心,在你甚至不需要的时候,也不需要为表单保留所需的内存。

        20
  •  -1
  •   sth    16 年前

    基于各种各样的建议,我所要做的就是:

    要隐藏表单:

    Me.Opacity = 0
    Me.ShowInTaskbar = false
    

    要显示表单:

    Me.Opacity = 100
    Me.ShowInTaskbar = true
    
        21
  •  -2
  •   steve_k    12 年前

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

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

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

    确保将位置设置为屏幕尺寸之外或之下的内容。稍后,当您想要显示表单时,请将位置设置为屏幕尺寸范围内的某个值。