C# / .NET messagebox is not modal

2019-01-17 14:21发布

问题:

Why is a C#/.NET message box not modal?

Accidentally, if the message box goes behind our main UI, then the main UI doesn't respond, until we click OK (on our message box).

Is there a workaround other than creating a custom message box?

回答1:

You need to assign the MessageBox owner property to the main UI window (look at the 3rd constructor).



回答2:

This is a simple C# new Windows Forms application:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string message = "You did not enter a server name. Cancel this operation?";
            string caption = "No Server Name Specified";
            MessageBoxButtons buttons = MessageBoxButtons.YesNo;
            DialogResult result;

            // Displays the MessageBox.
            result = MessageBox.Show(this, message, caption, buttons);
            if (result == DialogResult.Yes)
            {
                // Closes the parent form.
                this.Close();
            }
        }
    }
}

As Dusty states in his answer, a message box is a modal dialog. Specify the 'owner' property. In this example, the owner is denoted by the keyword 'this'.



回答3:

To get system modal messagebox set MessageBoxOptions.DefaultDesktopOnly.



回答4:

A modal pop-up is technically defined as a pop-up box that interrupts the normal flow of the application...not necessarily one that stays on the top of all other windows so the behavior you're describing is correct for a modal popup.

Modal Window

Here's a project on CodeProject that tries to mimic the "always on top" functionality for a MessageBox style Modal window:

CodeProject: TopMost MessageBox



回答5:

You can use the owner parameter to specify a particular object, which implements the IWin32Window interface, to place the message box in front of.

A message box is a modal dialog, which means no input (keyboard or mouse click) can occur except to objects on the modal form. The program must hide or close a modal form (typically in response to some user action) before input to another form can occur.

MessageBox.Show Method



回答6:

This is working for me:

MessageBox.Show(Form.ActiveForm,"Finished processing", "Process finished", , MessageBoxButtons.OK, MessageBoxIcon.Information);

Form.ActiveForm would give you the currently active form, even if you are raising your MessageBox from any other class.



回答7:

What I usually do if I have to trigger a MessageBox from another thread (not from the main thread) is this:

  1. I create a static variable with the form instance:

    private static Form1 myform;

  2. From the thread, I invoke the operation to show the MessageBox from the main thread:

    myform.BeginInvoke((MethodInvoker)delegate() { MessageBox.Show("Process finished!", "Thread Process Information", MessageBoxButtons.OK, MessageBoxIcon.Information); });

This is just a "cookie-cutter" that I always use, and works perfectly for me.



回答8:

Make the message box appear in the main thread, if your form has been created from it:

private bool ShowMessageBoxYesNo()
{
    if (this.InvokeRequired)
        return (bool)this.Invoke(new ShowMessageBoxYesNoDelegate(ShowMessageBoxYesNo));
    else
    {
        DialogResult res = MessageBox.Show("What ?", "Title", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (res == DialogResult.Yes)
            return true;
        else
            return false;
    }
}


回答9:

public static System.Windows.Forms.DialogResult WW_MessageBox(string Message, string Caption,
        System.Windows.Forms.MessageBoxButtons buttons, System.Windows.Forms.MessageBoxIcon icon,
        System.Windows.Forms.MessageBoxDefaultButton defaultButton)
    {
        System.Windows.Forms.MessageBox.Show(Message, Caption, buttons, icon, defaultButton,
            (System.Windows.Forms.MessageBoxOptions)8192 /*MB_TASKMODAL*/);

    }


回答10:

MessageBox is a local control which is local for the server. And it does not respond until clicking OK on the message box which is displayed in the server.