在我的应用程序中,我有一个在后台线程上运行的任务。当在UI线程中显示MessageBox或任何模态对话框时,我需要在后台线程中发出通知。
虽然我可以在显示MessageBox之前通过调用某个函数手动完成它,但是如果我不需要它会很棒。
例如:
backgroundThread.MessageShown(); // I do not want to call this explicitly every time!
MessageBox.Show("Task halted!");
我猜我可能会有一些信息可以挂钩。即使在主GUI线程中,是否有任何消息/事件在显示模式对话框之前被触发?
好的,这是要求。我有一些在UI线程上完成的任务,我必须在一个单独的对话框上显示进度,该对话框已在工作线程上显示。我理解它应该是必须在工作线程上完成的任务,但目前的情况暂时无法改变。
除了一个小故障外,每件事情都运行正常 - 如果UI线程中显示了一个消息框,它将隐藏在进度对话框下方。因此,用户永远不会知道UI正在等待输入。我需要一种方法来通知我已经显示了一个模态对话框,我应该隐藏进度对话框。
现在,我必须在每次调用MessageBox之前显式隐藏它。
我希望这可以解释。
答案 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作为类型。