我最近发现,默认情况下,MessageBoxes并不是显示在默认情况下最多的表单,我想知道是否有人知道什么情况下您不希望在其他窗口上显示消息框?
当我开始在加载应用程序时显示启动屏幕时,我发现了这个问题,看起来我的程序还在运行,但是在启动屏幕后面有一个MessageBox在等待输入。splash屏幕显示在一个与调用messagebox的线程不同的线程上,所以我想这就是为什么它没有出现在splash上面;但是这仍然不能解释为什么MessageBox默认没有MB_TOPMOST标志?
编辑
为了更好地澄清:最后,我不得不做一些类似的事情来创建一个消息盒,代码并不完全正确,就像从内存中写出来的那样)
[DllImport("User32.dll")]
private int extern MessageBox(windowhandle, message, caption, flag);
public static void MessageBox(windowhandle, string message, string caption)
{
MessageBox(windowhandle, message,caption, MB_TOPMOST);
}发布于 2013-04-19 13:20:37
要在最上面显示MessageBox,最重要的是为应用程序显示
码
//Should be MessageBox.Show() below
MessageBox.Show(this, "My top most message");默认情况下不是MB_TOPMOST 的原因
如果MB_TOPMOST是默认的,那么
MessageBox将出现在“系统模式”模式中,并且它将恰好位于该表单的顶部,副作用是“系统模式”模式将导致MessageBox阻塞窗口,直到消息正常被取消--它将是“应用模式”模式。
参考链接
发布于 2014-05-18 16:00:36
如果您可以获得一个句柄或对对话框应该出现在顶部的窗口的引用,则建议的解决方案可以工作。然而,这并不总是可能或容易做到的:
在这种情况下,您可以使用来自Win232 MessageBox API的User32.dll,但也可以使用更简单的托管解决方案:
MessageBox.Show(new Form { TopMost = true }, "Hello, I'm on top!");代码new Form { TopMost = true }将使用MB_TOPMOST属性创建一个隐藏表单,该属性由messagebox对话框窗口继承。因此,它将出现在所有其他窗口之上。使用new Form()内嵌没有副作用,没有视觉外观,它将通过垃圾收集器正常销毁。
注意:如果您已经不在表单中,请不要忘记名称空间,这是System.Windows.Forms.MessageBox__,而不是System.Windows.MessageBox__!(谢谢,https://stackoverflow.com/questions/16105097/why-isnt-messagebox-topmost/23723931#comment46178269_23723931)。
发布于 2013-04-19 13:05:38
当显示MessageBox时,提供它的所有者作为第一个参数。例如,当从Form实例调用调用时:
MessageBox.Show(this, "Message");作为第一个参数提供对拥有它的窗口的引用。
消息框(通常是模式窗体)不会出现在应用程序的所有窗口的顶部。它们只出现在主人的顶部。如果您希望您的消息框(或其他模式表单)位于启动屏幕的顶部,请将它们的所有者设置为splash实例。
https://stackoverflow.com/questions/16105097
复制相似问题