为什么不是MessageBox TopMost?

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 MessageBoxAPI 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).

  • 为了澄清其他人,这是`System.Windows.Forms.MessageBox`而不是`System.Windows.MessageBox` (5认同)

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阻止该窗口,直到该消息被驳回通常它将是"应用模式"模式.

参考链接

  1. MSDN论坛 - 如何将MessageBox显示为最顶层的窗口
  2. 当应用程序最小化到托盘时,SO - C#MessageBox到前面


Sin*_*ian 5

显示时MessageBox提供其所有者作为第一个参数。例如从Form实例调用中调用时:

MessageBox.Show(this, "Message");
Run Code Online (Sandbox Code Playgroud)

提供对拥有它的窗口的引用作为第一个参数。

消息框(以及一般的模态表单)不会出现在应用程序的所有窗口的顶部。它们只出现在它们的主人身上。如果您希望您的消息框(或其他模式表单)位于您的初始屏幕之上,请将其所有者设置为初始表单实例。