Ответ 1
Вам необходимо назначить свойство владельца MessageBox в главном окне пользовательского интерфейса (посмотрите на 3-й конструктор).
Почему поле сообщения С#/.NET не является модальным?
Случайно, если окно сообщения идет за нашим основным пользовательским интерфейсом, тогда основной пользовательский интерфейс не отвечает, пока мы не нажмем OK (в нашем окне сообщения).
Существует ли обходное решение, отличное от создания настраиваемого окна сообщений?
Вам необходимо назначить свойство владельца MessageBox в главном окне пользовательского интерфейса (посмотрите на 3-й конструктор).
Это простое приложение Windows Forms С#:
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();
}
}
}
}
Как Dusty заявляет в своем ответе, окно сообщения является модальным диалогом. Укажите свойство "владелец". В этом примере владелец обозначается ключевым словом 'this'.
Чтобы установить системный модальный набор сообщений MessageBoxOptions.DefaultDesktopOnly.
Модальное всплывающее окно технически определяется как всплывающее окно, которое прерывает нормальный поток приложения... не обязательно тот, который остается на вершине всех других окон, поэтому поведение, которое вы описываете, является правильным для модальное всплывающее окно.
Здесь проект CodeProject, который пытается имитировать функциональность "всегда сверху" для модального окна MessageBox:
Вы можете использовать параметр owner, чтобы указать конкретный объект, который реализует интерфейс IWin32Window, чтобы разместить окно сообщения перед.
Поле сообщения - это модальное диалоговое окно, что означает, что вход (клавиатура или щелчок мыши) не может произойти, кроме объектов в модальной форме. Программа должна скрыть или закрыть модальную форму (обычно в ответ на какое-либо действие пользователя), прежде чем может произойти ввод в другую форму.
Сделать поле сообщения в основном потоке, если ваша форма была создана из него:
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;
}
}
Это работает для меня:
MessageBox.Show(Form.ActiveForm,"Finished processing", "Process finished", , MessageBoxButtons.OK, MessageBoxIcon.Information);
Form.ActiveForm предоставит вам текущую активную форму, даже если вы поднимаете свой MessageBox из любого другого класса.
Что я обычно делаю, если мне нужно вызвать MessageBox из другого потока (а не из основного потока):
Я создаю статическую переменную с экземпляром формы:
закрытый статический Form1 myform;
Из потока я вызываю операцию, чтобы показать MessageBox из основного потока:
myform.BeginInvoke((MethodInvoker) delegate() {MessageBox.Show( "Процесс закончен!", "Информация о процессе потока", MessageBoxButtons.OK, MessageBoxIcon.Information);});
Это просто "куки-резак", который я всегда использую, и отлично работает для меня.
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*/);
}
MessageBox - локальный элемент управления, локальный для сервера. И он не отвечает, пока не нажмете OK в окне сообщения, которое отображается на сервере.