如何知道何时为表单显示消息框?

时间:2009-05-28 10:17:57

标签: c# forms

在我的应用程序中,我有一个在后台线程上运行的任务。当在UI线程中显示MessageBox或任何模态对话框时,我需要在后台线程中发出通知。

虽然我可以在显示MessageBox之前通过调用某个函数手动完成它,但是如果我不需要它会很棒。

例如:

backgroundThread.MessageShown(); // I do not want to call this explicitly every time!
MessageBox.Show("Task halted!");

我猜我可能会有一些信息可以挂钩。即使在主GUI线程中,是否有任何消息/事件在显示模式对话框之前被触发?

好的,这是要求。我有一些在UI线程上完成的任务,我必须在一个单独的对话框上显示进度,该对话框已在工作线程上显示。我理解它应该是必须在工作线程上完成的任务,但目前的情况暂时无法改变。

除了一个小故障外,每件事情都运行正常 - 如果UI线程中显示了一个消息框,它将隐藏在进度对话框下方。因此,用户永远不会知道UI正在等待输入。我需要一种方法来通知我已经显示了一个模态对话框,我应该隐藏进度对话框。

现在,我必须在每次调用MessageBox之前显式隐藏它。

我希望这可以解释。

3 个答案:

答案 0 :(得分:5)

设置CBT Hook。然后,您将收到所有已创建,已激活,已停用和已销毁窗口的通知。然后使用GetWindowClass检查创建/激活的hWnd实际上是否是MessageBox。

答案 1 :(得分:2)

创建自己的消息框,在调用Show?

时触发事件

答案 2 :(得分:0)

如果MessageBox的父级是TopMost,那么您的MessageBox将是TopMost。所以,像... ...

MessageBox.Show( new Form() { TopMost = true }, "Message and so forth ..." );

这也可能对你有用......

DllImport("user32.dll")]
public static extern int MessageBox(int hWnd, String text, String caption, uint type);

并传递MB_TOPMOST作为类型。