Daniella, parte de nuestro equipo de trabajo, nos hizo el favor de crear esta crónica porque conoce perfectamente dicho tema.
Solución:
todo lo que necesita para crear un formulario como pantalla de inicio y mostrarlo antes de que comience a mostrar la página de inicio y cierre este inicio una vez que se cargue la página de inicio.
using System.Threading;
using System.Windows.Forms;
namespace MyTools
public class SplashForm : Form
//Delegate for cross thread call to close
private delegate void CloseDelegate();
//The type of form to be displayed as the splash screen.
private static SplashForm splashForm;
static public void ShowSplashScreen()
// Make sure it is only launched once.
if (splashForm != null) return;
splashForm = new SplashScreen();
Thread thread = new Thread(new ThreadStart(SplashForm.ShowForm));
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
static private void ShowForm()
if (splashForm != null) Application.Run(splashForm);
static public void CloseForm()
splashForm?.Invoke(new CloseDelegate(SplashForm.CloseFormInternal));
static private void CloseFormInternal()
if (splashForm != null)
splashForm.Close();
splashForm = null;
;
y la función principal del programa se ve así:
[STAThread]
static void Main(string[] args)
SplashForm.ShowSplashScreen();
MainForm mainForm = new MainForm(); //this takes ages
SplashForm.CloseForm();
Application.Run(mainForm);
No olvide agregar un evento de carga de formulario a su formulario principal:
private void MainForm_Load(object sender, EventArgs e)
this.WindowState = FormWindowState.Minimized;
this.WindowState = FormWindowState.Normal;
this.Focus(); this.Show();
Traerá el formulario principal al primer plano después de ocultar la pantalla de bienvenida.
Tuve problemas con todas las demás soluciones que encontré, especialmente aquellas que muestran salpicaduras en otros subprocesos que no sean gui y especialmente en Citrix.
Ejemplo:
- Splash nunca cierra
- Splash show en el monitor equivocado
- Splash show ok pero mainform se muestra detrás de todas las demás ventanas
Terminé con esto y parece funcionar bien.
Forma de salpicadura:
public partial class Splash : Form
public Splash()
InitializeComponent();
private void pictureBox1_Click(object sender, EventArgs e)
continuación del formulario de presentación:
partial class Splash
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
if (disposing && (components != null))
components.Dispose();
base.Dispose(disposing);
private void InitializeComponent()
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Splash));
this.pictureBox1 = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(0, 0);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(512, 224);
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);
//
// Splash
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(512, 224);
this.ControlBox = false;
this.Controls.Add(this.pictureBox1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "Splash";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Splash";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
#endregion
private System.Windows.Forms.PictureBox pictureBox1;
Principal:
[STAThread]
static void Main(string[] _args)
ShowSplash();
MainForm mainForm = new MainForm();
Application.Run(mainForm);
private static void ShowSplash()
Splash sp = new Splash();
sp.Show();
Application.DoEvents();
System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
t.Interval = 1000;
t.Tick += new EventHandler((sender, ea) =>
sp.BeginInvoke(new Action(() =>
if (sp != null && Application.OpenForms.Count > 1)
sp.Close();
sp.Dispose();
sp = null;
t.Stop();
t.Dispose();
t = null;
));
);
t.Start();