Hi there movers & shakers,
The example below demonstrates a behaviour that is anoying the tits off of
me! It doesn't happen whilst debugging from the IDE only when you run the
compiled exe from windows explorer. I'm basically trying to display a splash
screen in a seperate thread which has it's own message pump. When the call
to Application.ExitThread() closes down the splash screen's thread, form and
message pump, the main form (and it's associated message pump) decides that
it has to process a WM_CLOSE message but i can't figure out who, what where
is firing that message. The result of this is that the main form has its
visible property set to false when the splash screen closes. I thought that
the use of the Application.Run() overload that doesn't take a Form as a
parameter wouldn't attach an event handler to the Form.Closed event like it
does in the other overload which is what i thought would be the thing w
Please note: I've seen lots of ways to implement splash screens on the news
groups etc and the examples i've seen are all pretty wanky if you ask me,
I'm not interested in how you have implemented your splash screen, i'm only
interested in explaining the behaviour that i'm seeing as it not only
relates to a splash screen but to other forms we display in our application.
the code below is the simplest i could come up with that demonstrates the
problem
cheers,
burger flavoured snack
using System;
using System.Threading;
using System.Windows.Forms;
namespace SplashTest
{
class SplashScreenViewer
{
Form splashForm;
public void Show()
{
Thread splashThread = new Thread(delegate()
{
splashForm = new Form();
splashForm.Text = "Splash Form";
splashForm.TopMost = true;
splashForm.Show();
Application.Run();
});
Thread sleepThread = new Thread(delegate()
{
Thread.Sleep(3000);
if (splashForm.InvokeRequired)
splashForm.BeginInvoke(new MethodInvoker(delegate() {
Application.ExitThread(); }));
else
Application.ExitThread();
});
splashThread.Start();
sleepThread.Start();
}
}
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
SplashScreenViewer viewer = new SplashScreenViewer();
viewer.Show();
Form mainForm = new Form();
mainForm.Text = "Main Form";
Application.Run(mainForm);
}
}
}