触发两个连续的MessageBox pop时,Windows窗体失去焦点

时间:2017-07-11 13:02:10

标签: c# forms winforms messagebox

Class MainForm:Form {
    Public CheckValidation()
    {
    var controller = new FormController();
    controller.checkValidation();
    }
}

    class FormController {
    public checkValidation ()
{
    MessageBox.Show('test_a',MessageBoxButtons.OK, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
    MessageBox.Show('test_b',MessageBoxButtons.OK, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
    }
}

问题是在第一个消息框弹出框关闭后,焦点会丢失到windows等窗口上的其他应用程序。

期望是焦点被发送到弹出的第二个消息框,该消息框排队等待下一个执行。因此,我不必手动点击第二个弹出框以激活它以关闭它。在第二个弹出框关闭后,焦点返回到主窗体。

2 个答案:

答案 0 :(得分:0)

我能够像这样解决这个问题

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

        public void CheckValidation()
        {
            var controller = new FormController(this);
            controller.checkValidation();
        }

        class FormController
        {
            Form1 form;

            public FormController(Form1 form)
            {
                this.form = form;
            }

            public void checkValidation()
            {
                MessageBox.Show("test_a", "test_a", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
                this.form.Activate();
                MessageBox.Show("test_b", "test_b", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
                this.form.Activate();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CheckValidation();
        }
    }
}

看看是否有帮助

答案 1 :(得分:0)

<强>解决方案: 删除'MessageBoxOptions.ServiceNotification'参数已有效。

替代解决方案1:

如果我们希望明确指定消息框应始终位于前面和最上面的窗口中,我们可以指定参数((0x40000),它是MB_TOPMOST选项的标志。

MessageBox.Show('test_a', MessageBoxButtons.OK, MessageBoxDefaultButton.Button1, (MessageBoxOptions)0x40000); //Message Box Top Most (MB_TOPMOST) = 0x40000

替代解决方案2: 另一种明确指定消息框应始终位于前面和最顶层窗口的方法,我们可以创建一个新的表单对象并将'TopMost'布尔选项设置为'True'。

MessageBox.Show(new Form() { TopMost = true }, 'test_b', MessageBoxButtons.OK, MessageBoxDefaultButton.Button1);
相关问题