Приховання однієї форми під час запуску


75

У мене є програма з однією формою, і за методом Load мені потрібно приховати форму.

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

Будь-які пропозиції?

Відповіді:


110

Я приходжу до цього з C #, але маю бути дуже подібним у vb.net.

У вашому основному програмному файлі, у методі Main, у вас буде щось на зразок:

Application.Run(new MainForm());

Це створює нову основну форму та обмежує термін дії заявки життям основної форми.

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

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


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

13
Наскільки я бачу, дизайнер не має властивості Visible.
Dan W

5
Visual Studio 2015 та .NET 4.5 тут ... Конструктор не має visibleвластивостей для форм. Я щось пропускаю?
Бен Філіпп,

1
виправте мене, якщо я помиляюся, Application.Run надає процесу цикл повідомлень, необхідний для форм Windows. Без цього ваш код всередині вашої форми потім вийде з ладу.
manit

1
Майте на увазі, що в цьому випадку Form_Loadвиклик не відбуватиметься, доки форма не з’явиться вперше. А може бути ніколи. Також закриття основної форми не закриє заявку. Ви повинні використовувати Application.Exit.
гримуча

104

Зазвичай ви робите це лише тоді, коли використовуєте піктограму лотка або інший спосіб для відображення форми пізніше, але це буде добре працювати, навіть якщо ви ніколи не відображаєте свою основну форму.

Створіть 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;                
    }
}

2
Дякую! На відміну від майже всіх інших пропозицій тут, тут НЕ відображається короткий спалах головного вікна.
Енді

2
Це фактично правильний спосіб зробити це, тому це має бути прийнятою відповіддю. Ще за днів MFC ми робили подібну справу, де обробляли перше повідомлення WM_WINDOWPOSCHANGING і приховували там форму, щоб запобігти «миготінню вікна».
enriquein

Дякую, я спробував прийняту відповідь, і вона не спрацювала, оскільки мені потрібно показати піктограму в треї, однак це працювало чудово.
Омар Коохеджі,

Це працює, але я думаю, що відповідь @ Jeff є кращою, оскільки вона не вимагає перевизначення з деяким логічним злому.
Mark Lakata

1
На жаль, піктограма сповіщення взагалі не відображається, коли я додаю у форму метод SetVisibleCore (), тому я не можу змусити його відображатись клацанням миші потім.
Dan W

35

Я використовую це:

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

Очевидно, вам доведеться змінити умову if на вашу.


2
Це призводить до того, що програма блимає, а потім швидко приховується під час запуску.
Dan W

Думаю, мені слід зробити так багато, якщо я не побачу ваш код. Подяка
М,

Щоб вирішити проблему спалаху під час запуску програми, встановіть у конструкторі для параметра Непрозорість форми значення 0, потім у зворотному виклику спочатку зателефонуйте Hide (), а потім встановіть значення Непрозорості назад до 100.
Майкл Брей

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

        base.OnLoad(e);
    }

1
Я хочу, щоб моя форма була прихована, АЛЕ все ще завантажена і працює. У такому випадку це рішення чудово працює. Проголосуйте за вас!
Джо Гайетті,

Я думаю, що це найкраще рішення, THX :)
Согейл

15

Під час побудови форми (конструктор, основна програма або конструктор форми, залежно від ваших цілей),

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

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

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

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

Послідовні події "Показати / приховати" можна простіше використовувати властивість "Видима форма" або "Показати / приховати".


Це працює і в події Load. Я думаю, що це так було задумано.
Mark Lakata

5

Спробуйте також сховати програму з панелі завдань.

Для цього скористайтеся цим кодом.

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

   base.OnLoad(e);
   }

Дякую. Рухул


4

Розширте свою основну форму за допомогою цієї форми:

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

Я багато боровся з цим питанням, і рішення набагато простіше, ніж я. Спочатку я спробував усі пропозиції тут, але потім я не був задоволений результатом і дослідив його ще трохи. Я виявив, що якщо додати:

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

3

Ви хочете встановити мінімальний стан вікна та показати на панелі завдань значення 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

Помістіть це у свій 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();

1

Замінити 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);
    }
...
}

0

Запуск програми без форми означає, що вам доведеться самостійно керувати запуском / вимкненням програми.

Початок форми з невидимого - кращий варіант.



0

Як доповнення до відповіді Грокі (що насправді є найкращою відповіддю на мій погляд) ми могли б також згадати клас ApplicationContext , який також дозволяє (як показано у зразку статті) можливість відкрити дві (або навіть більше) форми під час запуску програми та контролюйте тривалість програми всіма ними.


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

0

Для мене це чудово працює:

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

Коли я запускаю проект, все було приховано, включаючи панель завдань, якщо мені це не потрібно показати ..


0

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

Інші відповіді чудові і працюють, але я виявив, що загалом у події form_Load часто виникають такі проблеми, і те, що ви хочете помістити туди, може легко перейти в конструктор або подію form_Shown.

У будь-якому випадку, коли я перемістив той самий код, який перевіряє деякі речі, а потім приховує форму, коли вона не потрібна (форма входу, коли єдиний знак не працює), він працював, як очікувалося.


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

-1

Ось простий підхід:
це в 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;
}

якщо ви не додаєте рядок "Показати" у Form1_Load, форма все одно відображається, навіть якщо ви встановите значення "false" ... -1
Eugenio Miró

1
-1 Це не працює. Application.Run () змовляється проти вашого, щоб показати форму, незважаючи ні на що.
Mark Lakata

-2

У конструкторі встановіть для властивості Visible форми значення false. Тоді уникайте виклику Show (), доки це вам не знадобиться.

Кращою парадигмою є не створювати екземпляр форми, поки вона вам не знадобиться.


-2

На основі різноманітних пропозицій мені потрібно було лише це:

Щоб приховати форму:

Me.Opacity = 0
Me.ShowInTaskbar = false

Щоб показати форму:

Me.Opacity = 100
Me.ShowInTaskbar = true

Що робити, якщо користувач випадково натисне клавішу Enter або введе в прозору область? Я думаю, вам слід також зробити Me.Enable = false;
Angshuman Agarwal

-3

Чому це взагалі так?

Чому б просто не запустити як консольний додаток і показати форму, коли це необхідно? Немає нічого, крім кількох посилань, що відокремлюють консольний додаток від програми форм.

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


-3

Я роблю це так - з моєї точки зору найпростіший спосіб:

встановіть для форми 'StartPosition' значення 'Вручну' та додайте це до конструктора форми:

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

Переконайтеся, що для місця розташування встановлено щось, що перевищує розмір екрана або нижче нього. Пізніше, коли ви захочете показати форму, встановіть для Розташування щось у межах розмірів екрана.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.