创建一个不会阻止代码运行的消息框?

19

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

我猜我需要创建一个不同的线程或者其他什么东西来完成这个任务?请告诉我最好的实现方式。

谢谢!

2个回答

15

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

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

编辑:

我应该提到,我不建议这样做。这可能会引起其他问题。例如,如果您有两个线程在推送消息,那么消息框可能会被卡在另一个窗体后面,如果该窗体正在等待某人关闭消息框,则没有办法让它消失。你真的应该尝试找到另一种解决问题的方法。


1
ThreadPool.QueueUserWorkItem(delegate {MessageBox.Show("Text");}); => ThreadPool.QueueUserWorkItem(delegate {MessageBox.Show("文本");}); - sunside
2
@Markus:那也可以解决问题,但通常来说挂起一个 ThreadPool 线程并不是一个好的做法。 - Brian Gideon
1
@Soo:你不需要做任何特殊的事情。一旦MessageBox关闭,线程将会优雅地结束。 - Brian Gideon
我不确定我是否理解正确,但我认为在你的例子中,大多数操作系统都可以通过按住特定键(通常是Alt)并单击窗口来轻松移出窗口。虽然我不确定Windows是否也适用,但即使在那里,人们也可以只需按下Alt + Tab切换到MessageBox,然后按下Esc、Enter或Alt + F4。 - Hi-Angel
@Hi-Angel:可能是,但我认为用户可能仍然会觉得很烦人。 - Brian Gideon
显示剩余3条评论

13

不,你需要自己创建消息框表单。 MessageBox 类仅支持类似于 .ShowDialog() 的模态操作。

只需创建一个新的表单,使用参数来构建出符合您喜好的样式的消息框。


更新 2014-07-31

为了保持对通过 Google 发现此问题的其他人的清晰度,我想花点时间更详细地解释一下:

在幕后,MessageBox 是一个精巧的 C# 包装器,它围绕着 Windows SDK user32.dll MessageBox Function 进行操作,因此行为完全相同(在将 .NET Enums 转换为表示系统调用中相同的整数之后)。

这意味着当您调用 MessageBox.Show() 时,调用会被编组到操作系统并且将阻塞当前线程,直到选择选项或关闭窗口。为了防止代码停止,您需要在单独的线程上启动消息框,但这将意味着从消息框返回的任何结果( / / 确定 / 取消 / 等等...)将返回到被指定调用消息框的单独线程。

如果您对以这种方式启动的消息框的结果采取行动,则必须将结果分派回 UI 线程以进行线程安全。

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


好的,我只需创建自己的表单即可。非常简单易做,谢谢! - sooprise
如果我使用Messagebox.Show(MessageBoxButtons.OK),程序会在用户点击OK按钮之前暂停吗?因为我想要运行我的自动化流程,在前两个流程完成后,通过Messagebox暂停流程,然后在用户点击消息框后继续运行下一个自动化流程。 - HanH1113
@HanH1113 MessageBox.Show() 方法在底层实际上以与 .ShowDialog() 相同的方式运行。它是一个阻塞操作,因此执行会一直停止,直到对话框关闭。我已经更新了我的答案,使其更加清晰明了。 - Aren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接