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

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

в frmMain_Load я попробовал оба

this.Hide();
this.Visible = false;

без успеха.

Они работают в других методах, таких как NotifyIcon_MouseClick-метод, но я хочу, чтобы он скрывался При загрузке.

Я видел в другом вопросе здесь, где Матиас предложил это:

BeginInvoke(new MethodInvoker(delegate
{
    Hide();
}));

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

спасибо.

6 ответов


// In Your Program.cs Convert This
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

// To This
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Form1 TheForm = new Form1();
    Application.Run();
}

// Call Application.Exit() From Anywhere To Stop Application.Run() Message Pump and Exit Application

существует простой способ, если ваша программа имеет программу, сгенерированную Visual Studio по умолчанию.cs файл:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles ();
    Application.SetCompatibleTextRenderingDefault (false);
    Application.Run (new MainForm ());
}

простой факт вызова Run действительно сделает форму видимой. Попробуйте сделать следующее в свойствах формы:

  1. Set WindowState to Minimized
  2. Set ShowInTaskbar до false

это должно сделать трюк!


не вызывайте Show или ShowDialog в своей форме, вы можете иметь свое приложение.Запустите целевой пользовательский класс, который затем создает экземпляр формы и не показывает или создает экземпляр NotifyIcon и обрабатывает все оттуда.


вы также можете поместить это.hide = true в событии form_shown. Я считаю, что событие запускается только один раз и после события load. Вы можете увидеть мерцание alittle, хотя, если ваша форма имеет много элементов управления и / или компьютер медленный.


Если ваша программа не требует формы для запуска, то лучший метод-Вообще не иметь формы. Настройте NotifyIcon в коде программы и введите цикл, пока вы не захотите выйти из программы, установив какое-либо значение или вызвав какой-либо метод. В этом примере установка UserExitCalled в true (Program.UserExitCalled = true) приведет к выходу программы. Вот краткий пример:

static class Program {
    internal static Boolean UserExitCalled;

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        // Setup your tray icon here

        while (!UserExitCalled) {
            Application.DoEvents(); // Process windows messages
            Thread.Sleep(1);
        }

        return;
    }
}

здесь полный класс программы из одного из моих приложений в системном трее в качестве рабочего образец.

// *********************************************************************
// [DCOM Productions .NET]
// [DPDN], [Visual Studio Launcher]
//
//   THIS FILE IS PROVIDED "AS-IS" WITHOUT ANY WARRANTY OF ANY KIND. ANY
//   MODIFICATIONS TO THIS FILE IN ANY WAY ARE YOUR SOLE RESPONSIBILITY.
//
// [Copyright (C) DCOM Productions .NET  All rights reserved.]
// *********************************************************************

namespace VisualStudioLauncher
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using System.Threading;
    using VisualStudioLauncher.Common.Objects;
    using VisualStudioLauncher.Forms;
    using System.Drawing;
    using VisualStudioLauncher.Common.Data;
    using System.IO;
static class Program
{
    #region Properties

    private static ProjectLocationList m_ProjectLocationList;
    /// <summary>
    /// Gets or Sets the ProjectsLocationList
    /// </summary>
    public static ProjectLocationList ProjectLocationList
    {
        get
        {
            return m_ProjectLocationList;
        }

        set
        {
            m_ProjectLocationList = value;
        }
    }

    private static ShellProcessList m_ShellProcessList = null;
    /// <summary>
    /// Gets or Sets the ShellProcessList
    /// </summary>
    public static ShellProcessList ShellProcessList
    {
        get
        {
            return m_ShellProcessList;
        }

        set
        {
            m_ShellProcessList = value;
        }
    }

    private static NotifyIcon m_TrayIcon;
    /// <summary>
    /// Gets the programs tray application.
    /// </summary>
    public static NotifyIcon TrayIcon
    {
        get
        {
            return m_TrayIcon;
        }
    }

    private static bool m_UserExitCalled;
    /// <summary>
    /// Gets a value indicating whether the user has called for an Application.Exit
    /// </summary>
    public static bool UserExitCalled
    {
        get
        {
            return m_UserExitCalled;
        }

        set
        {
            m_UserExitCalled = value;
        }
    }

    // TODO: Finish implementation, then use this for real.
    private static ApplicationConfiguration m_ApplicationConfiguration = null;
    /// <summary>
    /// Gets the application configuration
    /// </summary>
    public static ApplicationConfiguration ApplicationConfiguration
    {
        get
        {
            if (m_ApplicationConfiguration == null)
                m_ApplicationConfiguration = ApplicationConfiguration.LoadConfigSection(@"./settings.config");

            return m_ApplicationConfiguration;
        }
    }


    #endregion

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        if (args.Length > 0)
        {
            if (args[0].ToLower() == "-rmvptr")
            {
                for (int i = 1; i < args.Length; i++) {
                    try {
                        if (File.Exists(Application.StartupPath + @"\" + args[i])) {
                            File.Delete(Application.StartupPath + @"\" + args[i]);
                        }
                    }
                    catch { /* this isn't critical, just convenient */ }
                }
            }
        }

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        SplashForm splashForm = new SplashForm();
        splashForm.Show();

        while (!UserExitCalled)
        {
            Application.DoEvents();
            Thread.Sleep(1);
        }

        if (m_TrayIcon != null)
        {
            m_TrayIcon.Icon = null;
            m_TrayIcon.Visible = false;
            m_TrayIcon.Dispose();

            GC.Collect();
        }
    }

    #region System Tray Management

    public static void SetupTrayIcon()
    {
        m_TrayIcon = new NotifyIcon();
        m_TrayIcon.Text = Resources.UserInterfaceStrings.ApplicationName;
        m_TrayIcon.Visible = false; // This will be set visible when the context menu is generated
        m_TrayIcon.MouseDoubleClick += new MouseEventHandler(m_TrayIcon_MouseDoubleClick);

        if (Orcas.IsInstalled)
        {
            m_TrayIcon.Icon = Orcas.Icon;
        }
        else if (Whidbey.IsInstalled) {
            m_TrayIcon.Icon = Whidbey.Icon;
        }
        else {
            m_TrayIcon.Icon = SystemIcons.Warning;
            m_TrayIcon.Text = "Visual Studio is not installed. VSL cannot run properly.";
        }
    }

    static void m_TrayIcon_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        if (e.Button != MouseButtons.Left)
        {
            return;
        }

        SettingsForm settingsForm = new SettingsForm();
        settingsForm.Show();
    }

    #endregion
}

}


Я сделал это, просто изменив это свойство: Application.OpenForms["Form1"].Opacity = 0;