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

6

71

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

Premonish answered 3/8, 2009 at 6:26 Comment(1)
No need for extra Code, try this: #4835319Sinistral
M
124

I tried the solution provided by donutboy and it doesn't seem to accept 0x40000 (or 40000) as a valid option as a MessageBoxOptions Enum value.

However I have found that using MessageBoxOptions.DefaultDesktopOnly has the same effect and keeps the MessageBox on top until it is confirmed by the user. ie.

MessageBox.Show("Hello there", "Prompt", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);

This is likely the simplest native solution on offer.

Malayalam answered 22/1, 2015 at 5:19 Comment(5)
Yes, I found this one works too! There are several suggestions but I agree that this is the easiest one to implement.Jamiejamieson
Exactly what I needed!Steelworks
Works like charm! This should be accepted as a solution.Androw
While this works, I ended up using Xceed MessageBox as that also centers box on top of Application.Undertake
Using Poweshell, this is also an accepted approach as well. [System.Windows.MessageBox]::Show($Message, "Prompt", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning, [System.Windows.MessageBoxResult]::OK, [System.Windows.MessageBoxOptions]::DefaultDesktopOnly )Ridgeway
A
38

There's a better solution, without creating a new form.

MessageBox.Show("Message Text", "Header", MessageBoxButtons.OK, MessageBoxIcon.None, 
     MessageBoxDefaultButton.Button1, (MessageBoxOptions)0x40000);  // MB_TOPMOST

The 0x40000 is the "MB_TOPMOST"-Flag.

Abridgment answered 22/12, 2013 at 11:46 Comment(0)
M
19

Another easy way to handle this:

MessageBox.Show(new Form { TopMost = true }, "This is TopMost", "TopMost", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Musaceous answered 27/1, 2016 at 14:25 Comment(3)
This is a better solution since it works properly on a multi-screens system.Alagoas
I used this for about three years in a production application and it works, however I ended up changing it Mike Dub's answer as we now have multiple screens and specifically want the message to always come up on the primary screen. We'll see how it goes.Pinette
Beware of the risk noted in the other answer: https://mcmap.net/q/274472/-keep-messagebox-show-on-top-of-other-application-using-c The form is not disposed like this.Mauve
O
3

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;
        }

    }
}     
Overslaugh answered 25/1, 2021 at 16:12 Comment(1)
Pretty sure with using {...} there is no need to call Dispose() manually. using will do that for you. So it could just be return MessageBox.Show(form, ...) inside the using blockMauve
A
2

Use the option MessageBoxOptions.DefaultDesktopOnly.

Aspergillosis answered 5/3, 2021 at 8:27 Comment(0)
H
1

Based on Dave's answer:

WPF:

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

Windows Form:

MessageBox.Show(new Form { TopMost = true }, "Message", "Title");
Harmonia answered 28/10, 2021 at 19:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.