c# - 为什么 MessageBox 不是 TopMost?

标签 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);
}

最佳答案

如果您可以获得对话框应该出现在其上的窗口的句柄或引用,则建议的解决方案有效。然而,这可能并不总是可能或容易实现:

  • 该窗口是启动画面,不应与您的业务逻辑紧密结合
  • 窗口是由当前类或库之外的其他类或库创建的
  • 窗口不受您的控制,即来自第三方( native )库

在这种情况下,您可以使用 User32.dll 中的 Win232 MessageBox API,但也可以使用更简单的托管解决方案:

MessageBox.Show(new Form { TopMost = true }, "Hello, I'm on top!");

代码 new Form { TopMost = true } 将创建一个具有 MB_TOPMOST 属性的隐藏表单,该属性由消息框对话框窗口继承。结果,它将出现在所有其他窗口的顶部。使用 new Form() 内联没有副作用,没有视觉外观,它将通过垃圾收集器正常销毁。

注意:如果您不在表单中,请不要忘记命名空间,这是 System.Windows.Forms.MessageBox,而不是 System.Windows.MessageBox ! (谢谢,user1)。

关于c# - 为什么 MessageBox 不是 TopMost?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16105097/

相关文章:

python - 在 python 中获取屏幕顶部的 tkinter Messagebox

c# - 带有按钮 "Yes to All"和 "No to All"的消息框

python - 将 openCV 窗口置于前面并关注焦点 macOS

javascript - 从子窗口中查找最顶层的父窗口

c# - 绑定(bind)到依赖属性,而依赖属性又绑定(bind)到另一个绑定(bind)源

c# - C#中如何判断一个对象是否可以转换为有意义的字符串

C#检查xml文件中的元素

c# - 带或不带虚拟目录的 CssRewriteUrlTransform

python - 使用 Tkinter 在消息框中显示进度

c# - 如何在不重叠全屏窗口的情况下显示最顶层窗口