使用 c# 将 Messagebox.show() 保留在其他应用程序之上

问题描述 投票:0回答:6

如何使用 C# 将 Messagebox.show() 保持在其他应用程序之上 ??

c#
6个回答
121
投票

我尝试了 donutboy 提供的解决方案,它似乎不接受 0x40000(或 40000)作为 MessageBoxOptions Enum 值的有效选项。

但是我发现使用 MessageBoxOptions.DefaultDesktopOnly 具有相同的效果,并将 MessageBox 保持在顶部,直到用户确认为止。 IE。

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

这可能是最简单的本机解决方案。


38
投票

有一个更好的解决方案,无需创建新表单。

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

0x40000 是“MB_TOPMOST”标志。


19
投票

另一种简单的方法来处理这个问题:

MessageBox.Show(new Form { TopMost = true }, "This is TopMost", "TopMost", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

3
投票

使用

new Form { TopMost = true }
作为第一个参数的问题是,它在完成后无法正确处理新表单。

花了很多功夫才发现这个问题(几周)。唯一的症状是半小时后程序“无法响应”。完全锁定,必须使用附加的调试器或任务管理器杀死它,没有可用的调试信息。

要解决这个问题,你需要这样的东西:

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

更好的是,编写你自己的“MyMessageBox”类,并使用它:

公共静态类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;
        }

    }
}     

2
投票

使用选项

MessageBoxOptions.DefaultDesktopOnly


1
投票

基于戴夫的回答

WPF:

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

Windows 窗体:

MessageBox.Show(new Form { TopMost = true }, "Message", "Title");
© www.soinside.com 2019 - 2024. All rights reserved.