创建一个不会停止代码的MessageBox?

时间:2010-07-08 16:05:54

标签: c# messagebox

好的,我正在寻找一些非常简单的东西:创建一个不会停止我的代码的MessageBox。

我猜我必须创建一个不同的线程或什么?请告知最佳方法。

谢谢!

2 个答案:

答案 0 :(得分:14)

您可以通过在单独的线程上调用它来启动另一个消息泵。 MessageBox.Show会发出消息,因此无需拨打Application.Run即可安全发送。

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

修改:

我可能应该提到我不建议这样做。它可能会导致其他问题。例如,如果您有两个线程在传递消息,那么消息框可能会卡在另一个表单后面,如果表单正在等待某人关闭消息框,则无法使其消失。你真的应该试图找出解决问题的另一种方法。

答案 1 :(得分:10)

不,你将不得不制作自己的留言箱表格。 MessageBox类仅支持类似于.ShowDialog()的行为,这是一种模态操作。

只需创建一个带有参数的新表单,然后根据自己的喜好使用这些参数构建样式化的消息框。


更新2014-07-31

本着通过谷歌发现这一点的任何其他人保持清晰的精神,我想花一点时间来解释一下这个:

引擎盖MessageBoxWindows SDK user32.dll MessageBox Function周围的一个奇特的C#Wrapper,因此行为方式完全相同(将.NET Enums转换为代表系统调用中相同内容的整数。) / p>

这意味着当您致电MessageBox.Show()时,呼叫将被整理到操作系统,并且阻止当前线程,直到选择了一个选项或窗口被终止。为了防止代码被暂停,您需要在单独的线程上启动消息框,但这意味着从消息框返回的任何结果( / / 确定 / 取消 /等等...)将返回到负责调用消息框的单独线程。

如果你按照这种方式启动此消息框的结果,你必须将结果发送回UI Thread for Thread Saftey。

或者,您可以在WinForms / WPF中创建自己的消息框表单,并使用.Show()方法调用它。按钮上的任何点击事件都将在UI线程上执行,您不必将调用分派回UI线程来操纵UI中的内容。