C#, Windows Form, Messagebox сверху не работает

у меня есть 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);
}

но почти каждый раз, когда я должен изменить окно на своем компьютере (например, вернуться в Visual Studio), прежде чем увидеть мой messagebox, и это не удобно и действительно раздражает.

Я проверил, что моя основная форма не была в TopMost=true, я попробовал только самый верхний или только верхний уровень, StartPosition=FormStartPosition.Центральный экран, но ничего не работало.

[обновление]

пробовал:

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

я хотел бы иметь мой messageBox на передней части моего окна и не нужно менять окно, чтобы увидеть его, потому что это как за текущим окном.

У вас есть идея, чтобы решить эту проблему?

7 ответов


данный экземпляр Form можно назвать MessageBox такой:
MessageBox.show(form, "Message", "Title"); (Проверьте doc для других параметров.)

если вы хотите назвать это из фонового потока (например: BackgroundWorker), вы должны использовать Form.Invoke() такой:

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

делай так:

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

он поставит его перед всеми другими окнами, в том числе из других процессов (что, я думаю, вы просите).

критический параметр MessageBoxOptions.DefaultDesktopOnly. Обратите внимание, что это будет родительское окно сообщения на рабочий стол по умолчанию, вызывая вызов приложения MessageBox.Show() терять фокус.

(вы действительно должны зарезервировать это поведение для критических сообщений.)

кроме того, если ваш приложение имеет окно, call this.BringToFront() прежде чем показывать окно сообщения, вызвав MessageBox.Show () с первым параметром, установленным в this. (Вы бы назвали это из класса window form).


Я ответил на этот здесь (но так как это довольно маленький ответ, я повторю его):

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

настройки MessageBox владелец новой формы, которая не была показана. Вместо new Form(){TopMost=true, TopLevel=True}, обратитесь к экземпляру существующей формы, которую вы хотите MessageBox на вершине.


далее к ответу Ларса, у меня была та же проблема, и метод Ларса работал, но если я затем выскочил сообщение из другого места, которое не было сверху, переключился на него, а затем сообщение было вызвано с помощью метода Ларса снова, он больше не будет сверху.

Это вариант, который я придумал, который хорошо работает для меня, надеюсь, вы найдете его полезным:

это выполняется из отдельного потока, который имеет ссылку на основной экземпляр формы приложения

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

попробуйте написать обобщить логику как: -

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

просто сделайте это как обычно (MessageBox.Show(Message);) Он уже самый верхний.

посмотреть здесь и здесь для сведения.