Подтвердить что ты не робот

Создание MessageBox, который не останавливает код?

Хорошо, я ищу что-то довольно простое: создание MessageBox, которое не останавливает мой код.

Я предполагаю, что мне нужно будет создать другой поток или что-то еще? Пожалуйста, сообщите нам, как это сделать.

Спасибо!

4b9b3361

Ответ 1

Нет, вам нужно будет создать свою форму в форме сообщения. класс MessageBox поддерживает только поведение, аналогичное .ShowDialog(), которое является модальной операцией.

Просто создайте новую форму, которая принимает параметры и использует их для создания стилизованного окна сообщений по своему вкусу.


Обновление 2014-07-31

В духе поддержания ясности для всех, кто находит это через google, я хотел бы взять секунду, чтобы объяснить это немного больше:

Под капотом MessageBox является причудливым С# Wrapper вокруг Windows SDK user32.dll MessageBox Function и, таким образом, ведет себя точно так же (после преобразования .NET Enums в целые числа, которые представляют одно и то же в системном вызове.

Это означает, что когда вы вызываете MessageBox.Show(), вызов маршалируется в ОС и блокирует текущий поток до тех пор, пока не будет выбран параметр или окно не будет убито. Чтобы предотвратить останов вашего кода, вам нужно запустить окно сообщения в отдельном потоке, но это будет означать, что любой результат, который возвращается из окна сообщения ( Да/ Нет/ Ok/ Отмена/Etc...) будет возвращен в отдельный поток, которому было поручено вызвать окно сообщения.

Если вы активируете результат этого окна сообщения, запускаемого таким образом, вам придется отправить результат обратно в поток пользовательского интерфейса для Thread Saftey.

В качестве альтернативы вы можете создать свою собственную форму окна сообщений в WinForms/WPF и вызвать ее с помощью метода .Show(). Любые события щелчка на кнопках будут выполняться в потоке пользовательского интерфейса, и вам не придется отправлять вызовы обратно в поток пользовательского интерфейса, чтобы манипулировать ими в пользовательском интерфейсе.

Ответ 2

Вы можете развернуть еще один насос сообщений, называя его отдельной веткой. MessageBox.Show, так что безопасно обойтись без вызова Application.Run.

public void ShowMessageBox()
{
  var thread = new Thread(
    () =>
    {
      MessageBox.Show(...);
    });
  thread.Start();
}

Изменить:

Я, наверное, должен упомянуть, что я не рекомендую это делать. Это может вызвать другие проблемы. Например, если у вас есть два потока, пересылающих сообщения, тогда поле сообщения может застрять за другой формой, чтобы не уйти, если форма ждет, когда кто-то закроет окно сообщения. Вы действительно должны попытаться найти другой способ решения проблемы.