Keep Messagebox.show() on top of other application using c#

Viewed 69560

How to keep a Messagebox.show() on top of other application using c# ??

6 Answers

The problem with using "new Form { TopMost = true }" as the first argument is that it fails to properly dispose of the new form when it is done.

It took a lot of work to find this problem (several weeks). The only symptom was that the program would "Fail to Respond" a half hour later. Totally locked up, had to kill it with an attached debugger or the task manager, no debug info available.

To solve this, you need something like this:

        using (Form form = new Form {TopMost = true})
        { 
            var retval = MessageBox.Show(form, text, caption, ok, error);
            form.Dispose();
            return retval;
        }
     

Even better, write your own "MyMessageBox" class, and use that:

public static class MyMessageBox {

    public static DialogResult Show(string text, string caption, MessageBoxButtons ok, MessageBoxIcon error)
    {
        using (Form form = new Form {TopMost = true})
        { 
            var retval = MessageBox.Show(form, text, caption, ok, error);
            form.Dispose();
            return retval;
        }
        // return UseForm ? MessageBox.Show(form, text, caption, ok, error) : MessageBox.Show(text, caption, ok, error);
    }
    public static DialogResult Show(string text, string caption, MessageBoxButtons ok)
    {
        using (Form form = new Form { TopMost = true })
        {
            var retval = MessageBox.Show(form, text, caption, ok);
            form.Dispose();
            return retval;
        }
    }
    public static DialogResult Show( string text, string caption)
    {
        using (Form form = new Form { TopMost = true })
        {
            var retval = MessageBox.Show(form, text, caption);
            form.Dispose();
            return retval;
        }
    }
    public static DialogResult Show(string text)
    {
        using (Form form = new Form { TopMost = true })
        {
            var retval = MessageBox.Show(form, text);
            form.Dispose();
            return retval;
        }

    }

}

Use the option

MessageBoxOptions.DefaultDesktopOnly

Based on Dave's answer:

WPF:

MessageBox.Show(new Window { Topmost = true }, "Message", "Title");

Windows Form:

MessageBox.Show(new Form { TopMost = true }, "Message", "Title");
Related