具有相同所有者的多个消息框

时间:2014-09-26 14:35:07

标签: c# winforms messagebox

我有一个应用程序通过显示消息框(MessageBox.Show)来响应外部事件(在应用程序之外生成)。它将所有者设置为我的应用程序的主窗口。

如果第二个事件在第一个模态被解除之前进入,我最终得到两个消息框。当我在第二个模型之前关闭第一个模型消息框时,问题就来了。在这种情况下,第二个框保持可见,但它已经失去了它的“模态” - 我可以操作应用程序,好像第二个模态窗口不在那里。

我尝试过的一个解决方案是从MessageBox.Show调用中删除owner参数。根据{{​​3}}:“默认情况下,消息框显示在当前处于活动状态的窗口前面。”我想通过不指定所有者,“活动”窗口将是所有者。如果没有模态,则主窗口处于活动状态。如果已经有一个模式已经激活并且作为所有者,则消息框将被“堆叠”,我将无法将它们排除在外。

不幸的是,这不起作用。没有一个模态有一个所有者 - 即使第一个消息框不是模态的,也没有阻止主窗口。

我考虑保存每个消息框的窗口并将其用作下一个的所有者,但后来我意识到没有直接的方法来获取消息框的窗口句柄 - Show()方法生成窗口,而不是返回,直到盒子被解雇。

我的问题分为两部分:这是消息框的预期行为吗?而且,我可以/应该做些什么来避免在我的应用程序中打开非模态消息框的情况?

1 个答案:

答案 0 :(得分:1)

一种解决方案是将外部事件放在队列中,一次只显示一个MessageBox。当一个关闭时,处理队列中的下一个事件(如果存在)。这样,一次只显示一个,因此一个MessageBox不能被另一个{{1}}拥有,并且它们应该由显示时活动的任何应用程序窗口拥有。而且,由于您正在使用队列,因此它们的显示顺序与接收基础事件的顺序相同。