7

我有一些像这样编码的 MessageBox:

MessageBox.Show(new Form(){TopMost=true, TopLevel=True}, "Message","Title", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);

举个更好的例子,我为 FormClosing 事件执行此操作:

private void Example_FormClosing(object sender, FormClosingEventArgs e){
MessageBox.Show(new Form(){TopMost=true, TopLevel=True}, "Really close?"," Program", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
}

但是,几乎每次我必须在看到我的消息框之前更改我的计算机上的 Window(比如返回 Visual Studio),而且它对用户不友好而且真的很烦人。

我确认我的主要表单不在 TopMost=true 中,我只尝试了 TopMost 或 TopLevel,StartPosition=FormStartPosition.CenterScreen 但没有任何效果。

[更新]

我试过:

 private void Example_FormClosing(object sender, FormClosingEventArgs e){
    MessageBox.Show(this.Owner, "Really close?"," Program", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
    }

我想将我的 messageBox 放在窗口的前面,而不必更改窗口即可看到它,因为它就像在当前窗口的后面。

你有解决这个问题的想法吗?

4

8 回答 8

12

像这样做:

MessageBox.Show(
    "Message", 
    "Title", 
    MessageBoxButtons.YesNo, 
    MessageBoxIcon.Warning, 
    MessageBoxDefaultButton.Button1, 
    MessageBoxOptions.DefaultDesktopOnly);

它将把它放在所有其他窗口的前面,包括来自其他进程的窗口(这就是我认为你所要求的)。

关键参数是MessageBoxOptions.DefaultDesktopOnly。请注意,这会将消息框作为默认桌面的父级,导致应用程序调用MessageBox.Show()失去焦点。

(您真的应该将此行为保留给关键消息。)

或者,如果您的应用程序有一个窗口,则this.BringToFront()在显示消息框之前调用 MessageBox.Show() 并将第一个参数设置为this。(您可以从窗口窗体类中调用它)。

于 2013-04-09T11:53:45.673 回答
5

给定一个你的实例,Form你可以这样调用MessageBox:(检查文档以获取其他参数。
MessageBox.show(form, "Message", "Title");

但是,如果您想从后台线程(例如:)调用它,BackgroundWorker则必须Form.Invoke()像这样使用:

form.Invoke((MethodInvoker)delegate
{
   MessageBox.show(form, "Message", "Title");
});
于 2013-08-29T15:15:04.937 回答
2

我已经在这里回答了这个问题(但因为它是一个相当小的答案,我会复制它):

using (var dummy = new Form() { TopMost = true })
{
    MessageBox.Show(dummy, text, title);
}
于 2014-10-24T14:49:38.067 回答
0

您正在将MessageBox所有者设置为尚未显示的新表单。而不是new Form(){TopMost=true, TopLevel=True},请引用您想要在其MessageBox之上的现有表单的实例。

于 2013-04-09T11:53:19.283 回答
0

在 Lars 的回答之后,我遇到了同样的问题并且 Lars 的方法有效,但是如果我从其他地方弹出一条不在顶部的消息,切换到它,然后再次使用 Lars 的方法调用该消息,它将不再位于顶部。

这是我想出的对我很有效的变体,希望对您有所帮助:

这是从一个单独的线程运行的,该线程具有对主应用程序表单实例的引用

//Show message on top of all other forms
MainFormInstance.Invoke((MethodInvoker)delegate
{
    Form popup = new Form() { TopMost = true, TopLevel = true };
    MessageBox.Show(popup, "Message", "Title");
});
于 2014-01-31T10:44:09.177 回答
0

尝试将泛化逻辑编写为:-

public static DialogResult ShowMessage(Form Parent, string Text, string Caption, MessageBoxButtons Buttons, MessageBoxIcon Icon, MessageBoxDefaultButton DefaultButton)
{
    if (Parent != null && Parent.InvokeRequired)
        return (DialogResult) Parent.Invoke(((Func<DialogResult>))(() => MessageBox.Show(Text, Caption, Buttons, Icon, DefaultButton)));
    else
        return (MessageBox.Show(Text, Caption, Buttons, Icon, DefaultButton));
}
于 2015-03-25T13:15:28.183 回答
0

我一直在玩这个并在 Windows 7/8.1/10 上运行多个测试,然后终于找到了一种工作方法,可以在上述所有系统的顶部显示消息框。

//Create an Empty Form with TopMost & TopLevel attributes.
Form popup = new Form() { TopMost = true, TopLevel = true };

//Running MessageBox on a different Thread

              Invoke((MethodInvoker)delegate {

     DialogResult dialogResult = MessageBox.Show(popup, "Custom Message Here", MessageBoxButtons.YesNo);
              if (dialogResult == DialogResult.Yes)
              {

                  //do something
              }
              else if (dialogResult == DialogResult.No)
              {
                  //do something else
              }

//Or a casual message box

//MessageBox.Show(popup, "Custom Message Here", "Alert");

 });
于 2019-02-08T16:19:41.787 回答
-1

像往常一样做(MessageBox.Show(Message);)它已经是最上面的了。

有关信息,请参见此处此处

于 2013-04-09T11:53:46.750 回答