C# 当连续触发两个MessageBox弹出窗口时,Windows窗体失去焦点

C# 当连续触发两个MessageBox弹出窗口时,Windows窗体失去焦点,c#,forms,winforms,messagebox,C#,Forms,Winforms,Messagebox,问题是,在第一个消息框弹出框关闭后,焦点会丢失到windows上的其他应用程序,如outlook 期望将焦点发送到第二个弹出消息框,该消息框排队等待下一个执行。这样我就不必手动点击第二个弹出框来激活它来关闭它。第二个弹出框关闭后,焦点返回主窗体。解决方案: 删除'MessageBoxOptions.ServiceNotification'参数有效 备选解决方案1: 如果我们希望明确指定消息框应始终位于最前面和最上面的窗口中,我们可以指定参数((0x40000),它是MB_TOPMOST选项的标志

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

期望将焦点发送到第二个弹出消息框,该消息框排队等待下一个执行。这样我就不必手动点击第二个弹出框来激活它来关闭它。第二个弹出框关闭后,焦点返回主窗体。

解决方案: 删除
'MessageBoxOptions.ServiceNotification'
参数有效

备选解决方案1:

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

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);
    }
}
备选解决方案2: 另一种明确指定消息框应始终位于最前面和最上面的窗口的方法是,我们可以创建一个新的表单对象,并将“最上面的”布尔选项设置为“True”

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

这不容易控制。Windows的焦点问题越来越严重。您可以通过将第一个参数设置为
This
来尝试锚定MessageBox。
MessageBox.Show(new Form() { TopMost = true }, 'test_b', MessageBoxButtons.OK, MessageBoxDefaultButton.Button1);