Ocultar formulario en el lanzamiento

Tengo un progtwig que solo necesita un NotifyIcon para funcionar según lo previsto. Así que he estado tratando de ocultar el formulario principal cuando se inicia el progtwig.

En frmMain_Load, probé ambos

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

sin éxito.

Funcionan en otros métodos, como en el método NotifyIcon_MouseClick, pero quiero que se oculte en la carga.

Vi en otra pregunta aquí en SO donde Matías sugirió esto:

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

Esto funciona, pero cuando ejecuto el progtwig puedo ver el formulario parpadeando muy rápido. Es mejor que nada, pero me pregunto si hay alguna solución mejor para esto.

Gracias.

 // 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 

Existe una forma fácil, si su progtwig tiene el archivo Program.cs generado por Visual Studio predeterminado:

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

El simple hecho de llamar a Run hará que la forma sea visible. Intenta hacer lo siguiente en las propiedades de tu formulario:

  1. Establecer WindowState en Minimized
  2. Establecer ShowInTaskbar en false

¡Esto debería funcionar!

No llame a Show o ShowDialog en su formulario, puede hacer que su Application.Run apunte a una clase personalizada que luego cree un formulario y no muestre o cree una instancia NotifyIcon y maneje todo desde allí.

También puede poner this.hide = true en el evento form_shown. Creo que el evento se dispara solo una vez y después del evento de carga. Es posible que veas un poco de parpadeo si tu formulario tiene muchos controles y / o la computadora es lenta.

Si su progtwig no requiere un formulario para ejecutarse, entonces el mejor método es no tener ningún formulario. Configure su NotifyIcon en el código del progtwig e ingrese un bucle hasta que desee salir del progtwig estableciendo algún valor o llamando a algún método. En este ejemplo, la configuración de UserExitCalled a true (Program.UserExitCalled = true) hará que el progtwig se cierre. Aquí hay un breve ejemplo:

 static class Program { internal static Boolean UserExitCalled; ///  /// The main entry point for the application. ///  [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; } } 

Aquí, la clase de progtwig completo de una de las aplicaciones de la bandeja de mi sistema como ejemplo de trabajo.

 // ********************************************************************* // [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; ///  /// Gets or Sets the ProjectsLocationList ///  public static ProjectLocationList ProjectLocationList { get { return m_ProjectLocationList; } set { m_ProjectLocationList = value; } } private static ShellProcessList m_ShellProcessList = null; ///  /// Gets or Sets the ShellProcessList ///  public static ShellProcessList ShellProcessList { get { return m_ShellProcessList; } set { m_ShellProcessList = value; } } private static NotifyIcon m_TrayIcon; ///  /// Gets the programs tray application. ///  public static NotifyIcon TrayIcon { get { return m_TrayIcon; } } private static bool m_UserExitCalled; ///  /// Gets a value indicating whether the user has called for an Application.Exit ///  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; ///  /// Gets the application configuration ///  public static ApplicationConfiguration ApplicationConfiguration { get { if (m_ApplicationConfiguration == null) m_ApplicationConfiguration = ApplicationConfiguration.LoadConfigSection(@"./settings.config"); return m_ApplicationConfiguration; } } #endregion ///  /// The main entry point for the application. ///  [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 } 

}

Lo he hecho cambiando esta propiedad: Application.OpenForms["Form1"].Opacity = 0;