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

本文关键字:消息 所有者 | 更新日期: 2023-09-27 18:24:35

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

如果在第一个模态被忽略之前出现了第二个事件,那么我会得到两个消息框。当我在第二个消息框之前关闭第一个模型消息框时,问题就出现了。在这种情况下,第二个框仍然可见,但它已经失去了"模态"——我可以像不存在第二个模态窗口一样操作应用程序。

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

不幸的是,这并没有奏效。没有一个模态有所有者——即使是第一个消息框也不是模态的,也没有阻塞主窗口。

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

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

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

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