Say*_*yse 41 c# messagebox topmost
我最近发现默认情况下默认情况下MessageBoxes不是最顶级的形式,我想知道是否有人知道你不希望消息框显示在其他窗口之上的任何情况?
当我开始在加载应用程序时显示启动画面时,我发现了这个问题,看起来我的程序仍在运行,但是MessageBox
在启动画面后面等待输入...启动画面显示在不同的线程上调用消息框的线程所以我想这就是为什么它没有出现在启动之上; 但这仍然无法解释为什么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);
}
Run Code Online (Sandbox Code Playgroud)
Abe*_*bel 69
如果您可以获得对话框应该出现在窗口上的句柄或引用,则建议的解决方案有效.但是,这可能并不总是可能或容易实现:
在这种情况下,您可以使用Win232 MessageBox
API User32.dll
,但也可以使用更简单的托管解决方案:
MessageBox.Show(new Form { TopMost = true }, "Hello, I'm on top!");
Run Code Online (Sandbox Code Playgroud)
代码new Form { TopMost = true }
将使用MB_TOPMOST
属性创建隐藏表单,该表单由消息框对话框窗口继承.因此,它将显示在所有其他窗口的顶部.使用new Form()
内联没有副作用,没有视觉外观,它将通过垃圾收集器正常销毁.
注意:如果您已经不在表单中,请不要忘记命名空间,这System.Windows.Forms.MessageBox
不是System.Windows.MessageBox
!(谢谢,user1).
Har*_*aid 31
显示MessageBox最重要的应用程序
码
//Should be MessageBox.Show() below
MessageBox.Show(this, "My top most message");
Run Code Online (Sandbox Code Playgroud)
不是MB_TOPMOST
默认的原因
如果MB_TOPMOST将默认那么
MessageBox
将在"系统模式"的模式出现了,这将是完全对这种形式和副作用顶部是在"系统模式"模式将导致MessageBox
以阻止该窗口,直到该消息被驳回通常它将是"应用模式"模式.
参考链接
显示时MessageBox
提供其所有者作为第一个参数。例如从Form
实例调用中调用时:
MessageBox.Show(this, "Message");
Run Code Online (Sandbox Code Playgroud)
提供对拥有它的窗口的引用作为第一个参数。
消息框(以及一般的模态表单)不会出现在应用程序的所有窗口的顶部。它们只出现在它们的主人身上。如果您希望您的消息框(或其他模式表单)位于您的初始屏幕之上,请将其所有者设置为初始表单实例。