6

我有两种形式,我将其中一种形式的TopMost属性设置为 true。在某个地方,当程序运行时,我显示了一个 MessageBox,但由于 TopMost 设置为 true,当 MessageBox 弹出时,它显示在最顶层的窗体下,所以我看不到它。

  1. 有什么方法可以让我的一个表单始终位于顶部,但是当 MessageBox 弹出时,让消息框显示在该特定表单的顶部?

  2. 是否可以为 MessageBox 提供一个位置,使其不在中间显示,而是在屏幕下方显示?

  3. 假设我有一个橙色的表单,我可以有一个仅用于该特定应用程序的粉红色消息框。我的意思是我不是指播放窗口颜色属性。(我不希望所有消息框都是粉红色的。)

4

7 回答 7

11

我用这个。

MessageBox.Show(
                "message",
                "title",
                MessageBoxButtons.OK,
                messageBoxIcon,
                MessageBoxDefaultButton.Button1,
                (MessageBoxOptions)0x40000); // this set TopMost
于 2015-09-05T05:50:36.097 回答
9

1) MessageBox.Show 方法有一个重载,它采用 Window 类型的第一个参数。如果您使用该重载而不仅仅是 Show(string),即:

class MyForm : Form {
    void method(){
       MessageBox.Show(this, "blablablablabla");
    }
}

然后 MessageBox 将以“模态”模式显示,并且恰好位于该表单的顶部。现在只要确保你通过了最上面的表格,你就完成了。副作用是“模态”模式将导致消息框阻塞原始窗口,直到消息被解除。

2)不,这不可能直接。但是,您可以努力使用 .Net 并获得消息框的“句柄”,然后通过 P/Invoke 将窗口移动到某些 WinApi 函数,但我不建议您这样做。

3) 不,这对于 MessageBoxes 是不可能的

您想要在 (2) 和 (3) 中实现的目标是不可能的,因为 MsgBox 本来就是简单的。要获得这些东西,您必须编写自己的小型表单,充当消息框,并呈现该表单而不是消息框。该表单将能够具有您喜欢的任何样式、任何位置和任何行为。

于 2012-08-11T00:08:59.007 回答
5

一个最简单的方法MessageBox是这样的:

using (var dummy = new Form() { TopMost = true })
{
    MessageBox.Show(dummy, text, title);
}

您不必实际显示虚拟表单。

于 2014-10-24T14:43:23.113 回答
5

MessageBox在应用程序的所有其他形式(包括带有 set 的形式)之上显示 a,TopMost您可以使用Show()方法重载,该方法采用类型参数MessageBoxOptions并将 MessageBoxOptions.ServiceNotification 作为该参数传递。

DialogResult result = MessageBox.Show("Configuration file was corrupted.\n\nDo you want to reset it to default and lose all configurations?", "Config File Corrupted", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, MessageBoxOptions.ServiceNotification);
于 2015-07-21T11:40:43.617 回答
1

我认为 .Net 中没有内置功能可以做到这一点,但我建议您保留 TopMost 表单的引用,并在显示每条消息之前对其进行更改,如下所示:

    public static void ShowMessage(string message)
    {
        Component.InstanceOfTopMost.TopMost = false;
        MessageBox.Show(message);
        Component.InstanceOfTopMost.TopMost = true;
    }

Component是一个静态类,它包含您的表单的引用,它应该是 TopMost。这个静态类的原因是您可能想在多个地方使用该表单,这样您就可以轻松访问您的表单。这是一种简单的方法,您可以根据需要更改它。

更新 :

        public class Component
        {
            public static Form2 InstanceOfTopMost { get; set; }
        }

组件只是一个名称,给它另一个名称,因为还有另一个名为 Component 的 .Net 类。

        var frm = new Form2();
        Component.InstanceOfTopMost = frm;
        frm.Show();

希望这有帮助。

于 2012-08-10T23:38:31.073 回答
1

@Saber Amani:为什么会这样?看,它只是工作:

    using System.Windows.Forms;

    namespace ReusingUserControlsSample
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, System.EventArgs e)
            {
                Form1 second = new Form1();
                second.TopMost = true;
                second.Show();

                MessageBox.Show(second, "BLARGH");
            }

            private void InitializeComponent()
            {
                this.button1 = new System.Windows.Forms.Button();
                this.SuspendLayout();
                this.button1.Location = new System.Drawing.Point(178, 201);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(75, 23);
                this.button1.TabIndex = 0;
                this.button1.Text = "button1";
                this.button1.UseVisualStyleBackColor = true;
                this.button1.Click += new System.EventHandler(this.button1_Click);
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(284, 264);
                this.Controls.Add(this.button1);
                this.Name = "Form1";
                this.Text = "Form1";
                this.ResumeLayout(false);

            }

            private System.Windows.Forms.Button button1;
        }
    }

MSG 正确显示在第二种形式 TopMost 上。唯一的“问题”是知道哪种形式是最顶层的。

于 2012-08-11T00:29:29.450 回答
0
https://stackoverflow.com/questions/29326042/show-message-box-in-net-console-application
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox

using System.Runtime.InteropServices;
//...
[DllImport("User32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr h, string m, string c, uint type);
const uint ICONERROR = 16;
const uint ICONWARNING = 48;
const uint ICONINFORMATION = 64;
const uint MB_TOPMOST = 262144;

//...
MessageBox((IntPtr)0, "Started" + DateTime.Now, "Log", ICONINFORMATION | MB_TOPMOST);
于 2020-08-13T14:45:23.640 回答