C# 具有相同所有者的多个MessageBox

C# 具有相同所有者的多个MessageBox,c#,winforms,messagebox,C#,Winforms,Messagebox,我有一个应用程序,它通过显示messagebox(messagebox.Show)来响应外部事件(在应用程序外部生成)。它将所有者设置为我的应用程序的主窗口 如果第二个事件在第一个模态被取消之前出现,那么我将得到两个MessageBox。当我在第二个模型messagebox之前关闭第一个模型messagebox时,问题就出现了。在这种情况下,第二个框保持可见,但它已失去其“模态特性”-我可以操作应用程序,就好像第二个模态窗口不在那里一样 我尝试过的一个解决方案是从MessageBox.Show调

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

如果第二个事件在第一个模态被取消之前出现,那么我将得到两个MessageBox。当我在第二个模型messagebox之前关闭第一个模型messagebox时,问题就出现了。在这种情况下,第二个框保持可见,但它已失去其“模态特性”-我可以操作应用程序,就好像第二个模态窗口不在那里一样

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

不幸的是,这没有起作用。没有一个modals有所有者-即使第一个messagebox不是modal,也不会阻止主窗口

我考虑过保存每个messagebox的窗口,并将其用作下一个窗口的所有者,但后来我意识到没有直接的方法可以获取messagebox的窗口句柄-Show()方法生成窗口,并且直到关闭该窗口后才会返回


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

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

在这种情况下,模态消息框似乎不是合适的UI元素。如果消息以相当连续但不可预测的方式到达系统,则最好在其中一个窗体上以某种列表的形式显示它们。应用程序中的一种“通知中心”。@David-一般来说我同意,但在这种情况下,它们是确认对话框,而不仅仅是信息对话框。请求可以被拒绝/取消。可能仍然需要更好的UI。