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

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

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

Любые предложения?

Ответ 1

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

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

Application.Run(new MainForm());

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

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

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

Ответ 2

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

Создайте 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;                
    }
}

Ответ 3

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

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

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

Ответ 4

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

        base.OnLoad(e);
    }

Ответ 5

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

 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 могут более просто использовать свойство Form Visible или Show/Hide.

Ответ 6

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

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

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

   base.OnLoad(e);
   }

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

Ответ 7

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

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/

Ответ 8

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

 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

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

Ответ 10

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

Ответ 11

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

Ответ 12

Вот простой подход:
Это в С# (у меня нет компилятора 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;
}

Ответ 13

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

Запуск формы с невидимым - лучший вариант.

Ответ 14

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

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

Ответ 15

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

Ответ 16

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

Ответ 17

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

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

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

Ответ 18

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

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

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

Ответ 19

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

Ответ 20

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

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

Ответ 21

Зачем это вообще?

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

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

Ответ 22

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

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

Me.Opacity = 0
Me.ShowInTaskbar = false

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

Me.Opacity = 100
Me.ShowInTaskbar = true

Ответ 23

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

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

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

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