Одиночная форма Скрыть при запуске - PullRequest
69 голосов
/ 16 сентября 2008

У меня есть приложение с одной формой, и в методе Load мне нужно скрыть форму.

Форма будет отображаться сама собой, когда в этом есть необходимость (подумайте по аналогии со всплывающим окном в стиле outlook 2003), но я не могу понять, как скрыть форму при загрузке без каких-либо проблем.

Есть предложения?

Ответы [ 22 ]

106 голосов
/ 16 сентября 2008

Я пришёл к этому из C #, но должен быть очень похож на vb.net.

В вашем основном программном файле, в методе Main, у вас будет что-то вроде:

Application.Run(new MainForm());

Это создает новую основную форму и ограничивает время жизни приложения временем жизни основной формы.

Однако, если вы удалите параметр для Application.Run (), то приложение будет запущено без отображения формы, и вы сможете свободно показывать и скрывать формы сколько угодно.

Вместо того, чтобы скрывать форму в методе Load, инициализируйте форму перед вызовом Application.Run (). Я предполагаю, что форма будет иметь NotifyIcon для отображения значка на панели задач - это можно отобразить, даже если сама форма еще не видна. Вызов Form.Show() или Form.Hide() из обработчиков событий NotifyIcon покажет и скроет форму соответственно.

91 голосов
/ 18 ноября 2010

Обычно вы делаете это только тогда, когда используете значок в трее или какой-либо другой метод для отображения формы позже, но это будет хорошо работать, даже если вы никогда не отображаете основную форму.

Создайте в своем классе bool значение по умолчанию false:

private bool allowshowdisplay = false;

Затем переопределите метод SetVisibleCore

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

Поскольку Application.Run () устанавливает формы .Visible = true после загрузки формы, он будет перехватывать это значение и устанавливать значение false. В приведенном выше случае он всегда будет иметь значение false до тех пор, пока вы не включите его, установив для параметра allowhowdisplay значение true.

Теперь, когда форма не будет отображаться при запуске, теперь вам нужно снова включить SetVisibleCore для правильной работы, установив allowhowdisplay = true. Вы захотите сделать это в любой функции пользовательского интерфейса, которая отображает форму. В моем примере это событие левого клика в моем объекте notiyicon:

private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        this.allowshowdisplay = true;
        this.Visible = !this.Visible;                
    }
}
33 голосов
/ 10 октября 2008

Я использую это:

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

Очевидно, вы должны изменить условие if на ваше.

18 голосов
/ 06 августа 2012
    protected override void OnLoad(EventArgs e)
    {
        Visible = false; // Hide form window.
        ShowInTaskbar = false; // Remove from taskbar.
        Opacity = 0;

        base.OnLoad(e);
    }
14 голосов
/ 17 марта 2011

Во время создания формы (конструктор, программа Main или конструктор форм, в зависимости от ваших целей),

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

Когда вам нужно показать форму, предположительно по событию из вашего NotifyIcon, при необходимости отмените,

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

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

Последовательные события show / hide могут проще использовать свойство Visible формы или методы Show / Hide.

5 голосов
/ 28 октября 2016

Попробуйте также скрыть приложение из панели задач.

Для этого используйте этот код.

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

   base.OnLoad(e);
   }

Спасибо. Рухул

4 голосов
/ 31 декабря 2008

Расширьте свою основную форму с этим:

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/

3 голосов
/ 15 марта 2016

Вы захотите установить минимизированное состояние окна и показать на панели задач значение 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;
    }
3 голосов
/ 09 декабря 2012

Я много боролся с этой проблемой, и решение намного проще, чем я. Сначала я попробовал все предложения здесь, но потом я не был удовлетворен результатом и исследовал его немного больше. Я обнаружил, что если я добавлю:

 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;
}
2 голосов
/ 11 октября 2018

Поместите это в свой 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...