Одиночная форма Скрыть при запуске

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

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

Какие-либо предложения?

25 ответов

Решение

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

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

Application.Run(new MainForm());

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

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

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

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

Создайте bool в вашем классе Form, который по умолчанию равен 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;                
    }
}

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

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;

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

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

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

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

   base.OnLoad(e);
   }

Благодарю. Рухул

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

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/

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

Поместите это в свой 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();

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

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

Переопределить 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);
    }
...
}

Это прекрасно работает для меня:

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

Когда я запускал проект, все было скрыто, в том числе на панели задач, если мне не нужно показывать его..

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

В этом примере поддерживается полная невидимость, а также только NotifyIcon в системном трее, нет кликов и многое другое.

Подробнее здесь: http://code.msdn.microsoft.com/TheNotifyIconExample

Это сработало для меня:

      protected override void SetVisibleCore(bool value)
{
    if (!this.IsHandleCreated)
    {
        this.CreateHandle();
        value = false;
    }

    base.SetVisibleCore(value);
}

Я использую WindowState как минимизированный для FormMain в дизайнере.

А в FormMain_Load используйте Hide();

таким образом, при закрытии formMain приложение закрывается, потому что я вставил его:

Application.Run(formMain = новый FormMain());

А notifyIconMain установлен как видимый в дизайнере.

И:

             private void notifyIconMain_MouseDoubleClick(object sender, MouseEventArgs e)
                {
                    Show();
                    WindowState = FormWindowState.Normal;
                    //notifyIconMain.Visible = false;
                }
        
        private void buttonHideToTray_Click(object sender, EventArgs e)
                {
                    Hide();
                    //notifyIconMain.Visible = true;
                }

Если вы хотите скрыть notifyIconMain на панели задач при отображении формы, раскомментируйте две строки в блоке кода выше.

В качестве дополнения к ответу Groky (который на самом деле является лучшим ответом на мой взгляд) мы могли бы также упомянуть класс ApplicationContext, который также позволяет (как показано в примере статьи) возможность открывать две (или даже больше) формы при запуске приложения и контролируйте время жизни приложения со всеми из них.

У меня была проблема, похожая на постер, где код для скрытия формы в событии form_Load срабатывал до того, как форма была полностью загружена, что приводило к сбою метода Hide() (без сбоев, просто не работал должным образом).

Другие ответы хороши и работают, но я обнаружил, что в общем случае событие form_Load часто имеет такие проблемы, и то, что вы хотите поместить туда, может быть легко добавлено в конструктор или событие form_Shown.

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

Запуск приложения без формы означает, что вам придется самостоятельно управлять запуском / закрытием приложения.

Лучше всего начать с невидимой формы.

Почему это так?

Почему бы просто не начать как консольное приложение и показать форму, когда это необходимо? Нет ничего, кроме нескольких ссылок, отделяющих консольное приложение от приложения форм.

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

Исходя из различных предложений, все, что мне нужно было сделать, это:

Чтобы скрыть форму:

Me.Opacity = 0
Me.ShowInTaskbar = false

Чтобы показать форму:

Me.Opacity = 100
Me.ShowInTaskbar = true

Вот простой подход:
Это на 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;
}

Я делаю это так - с моей точки зрения, самый простой способ:

установите "StartPosition" формы в "Manual" и добавьте это в конструктор формы:

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

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

В конструкторе установите для свойства Visible формы значение false. Затем избегайте вызова Show(), пока он вам не понадобится.

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

Другие вопросы по тегам