我最近发现默认情况下 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/