views:

1889

answers:

4

I'm writing a Windows Forms Application in C#.NET

On startup, the application displays a splash screen which is running in a separate thread. Whilst the splash screen is showing, the main application is initialising.

Once the main application has finished initialising, the main form of the application is displayed, and the splash screen still shows over the top.

Everything so far is as expected.

Then, the Splash screen is closed, which causes that thread to exit. For some reason, at the point, the main application windows gets sent behind all other open Windows, notably the Windows Explorer window where you clicked the .exe file to run the application in the first place!

What could be causing the windows to suddenly jump "behind" like this?

+6  A: 

Try calling .Activate() on your main window when your thread closes.

It's never been active, and thus has low Z-Order, so whatever is higher will naturally be above it. I had to fix this exact scenario in our app.

Don't forget! You may need to marshal the call to the correct thread using an Invoke()!

Bob King
+1  A: 

I've had this happen at times too. Bob's response is the easiest and works for me in the majority of cases. However, there have been some times where I need to use brute force. Do this via interop like this:

[DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd);

billb
+1  A: 

Is the splash screen a Modal dialog?

I have seen this window 'jumping' if you dismiss a Modal dialog twice by setting both DialogResult and calling Hide() or close().

Code like this:

private void button1_Click(object sender, System.EventArgs e)
{
     this.DialogResult = DialogResult.Abort;
     this.Hide();
}

See this blog entry for all of the cases...

Jack Bolding
A: 

private void button1_Click(object sender, System.EventArgs e) { this.DialogResult = DialogResult.Abort; this.Hide(); }

thanks all!

khoa