C#,Windows Form,Messagebox在上面不起作用

时间:2013-04-09 11:49:53

标签: c# messagebox topmost

我有一些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,而不必更改窗口以查看它,因为它就像在当前窗口后面一样。

您有想法解决此问题吗?

8 个答案:

答案 0 :(得分:9)

这样做:

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

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

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

(您应该为关键消息保留此行为。)

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

答案 1 :(得分:4)

根据您Form的实例,您可以像这样拨打MessageBox
MessageBox.show(form, "Message", "Title");Check the doc for other parameters.

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

form.Invoke((MethodInvoker)delegate
{
   MessageBox.show(form, "Message", "Title");
});

答案 2 :(得分:2)

我已经回复了here(但由于这是一个相当小的答案,我会复制它):

using (var dummy = new Form() { TopMost = true })
{
    MessageBox.Show(dummy, text, title);
}

答案 3 :(得分:0)

您正在将MessageBox所有者设置为尚未显示的新表单。而不是new Form(){TopMost=true, TopLevel=True},请参阅您希望MessageBox位于其上的现有表单的实例。

答案 4 :(得分: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");
});

答案 5 :(得分:0)

尝试将generalize逻辑写为: -

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

答案 6 :(得分: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");

 });

答案 7 :(得分:-1)

正常做(MessageBox.Show(Message);),这已经是最重要的了。

请参阅herehere了解相关信息。