I recently found out that by default MessageBoxes were not the top most form when displayed by default and I was wondering if anyone knew any circumstances when you wouldn't want the messagebox to be shown on top of other windows?
I found the issue when I started to show splash screens whilst loading an application, and it looked like my program was still running but there was a MessageBox
behind the splash screen that was waiting for input.. The splash screen was shown on a different thread to the thread that called the messagebox so I imagine this is why it didn't appear above the splash; but this still doesn't explain why MessageBox doesn't have the MB_TOPMOST
flag by default?
Edit
To better clarify: in the end I had to do something similar to this in the end to make a messagebox, code isn't exactly correct as wrote from memory)
[DllImport("User32.dll")]
private int extern MessageBox(windowhandle, message, caption, flag);
public static void MessageBox(windowhandle, string message, string caption)
{
MessageBox(windowhandle, message,caption, MB_TOPMOST);
}
The proposed solutions work if you can get a handle or reference to the window the dialog is supposed to appear on top of. However, this may not always be possible or easy to achieve:
In such scenarios, you could use the Win232
MessageBox
API fromUser32.dll
, but a simpler, managed solution is also available:The code
new Form { TopMost = true }
will create a hidden form with theMB_TOPMOST
property, which is inherited by the messagebox dialog window. As a result, it will appear on top of all your other windows. Usingnew Form()
inline has no side-effects, has no visual appearance and it will be destroyed normally via the garbage collector.Note: if you are not inside a form already, don't forget the namespace, this is
System.Windows.Forms.MessageBox
, notSystem.Windows.MessageBox
! (thanks, user1).I try to paste a more complete code piece, it's definitely working
To show the MessageBox on top-most of all for the application
Code
Reason for not being
MB_TOPMOST
by defaultReference links
When showing
MessageBox
provide its owner as the first argument. For example when invoking from aForm
instance call:Provide a reference to the window owning it as the first argument.
Message boxes (and modal forms in general) do not appear on top of all windows of your application. They only appear on top of their owner. If you want your message-box (or other modal forms) be on top of your splash screen, set their owner to the splash form instance.
The answer given above is obviously correct minus the fact that it needs to call System.iDisposable.Dispose on the object new Form.
For more:
Top-Most-MessageBox Examples