如何使用 C# 将 Messagebox.show() 保持在其他应用程序之上 ??
我尝试了 donutboy 提供的解决方案,它似乎不接受 0x40000(或 40000)作为 MessageBoxOptions Enum 值的有效选项。
但是我发现使用 MessageBoxOptions.DefaultDesktopOnly 具有相同的效果,并将 MessageBox 保持在顶部,直到用户确认为止。 IE。
MessageBox.Show("Hello there", "Prompt", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
这可能是最简单的本机解决方案。
有一个更好的解决方案,无需创建新表单。
MessageBox.Show("Message Text", "Header", MessageBoxButtons.OK, MessageBoxIcon.None,
MessageBoxDefaultButton.Button1, (MessageBoxOptions)0x40000); // MB_TOPMOST
0x40000 是“MB_TOPMOST”标志。
另一种简单的方法来处理这个问题:
MessageBox.Show(new Form { TopMost = true }, "This is TopMost", "TopMost", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
使用
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;
}
}
}
使用选项
MessageBoxOptions.DefaultDesktopOnly
。
基于戴夫的回答:
WPF:
MessageBox.Show(new Window { Topmost = true }, "Message", "Title");
Windows 窗体:
MessageBox.Show(new Form { TopMost = true }, "Message", "Title");