C#Winforms:多个顶级窗口和ShowDialog()

时间:2009-02-24 12:08:55

标签: c# winforms modal-dialog

我有一个使用show多个顶级窗口的Winforms应用程序:

Form1 form1 = new Form1();
form1.Show();
Form2 form2 = new Form2();
form2.Show();
Application.Run();

在Form1中的一个事件处理程序中,我希望能够显示一个模态对话框:

Dialog dialog = new Dialog();
dialog.ShowDialog(form1);

不暂停其他顶级窗口。

这可能吗?

4 个答案:

答案 0 :(得分:5)

我相信,您需要在自己的STA线程上运行每个顶级窗口才能实现这一目标。

答案 1 :(得分:2)

有一个简单的解决方案似乎正常工作。您可以简单地检查我们是否被禁用,并在需要时重新启用。

    [DllImport("user32.dll")]
    private static extern void EnableWindow(IntPtr handle, bool enable);

    protected override void WndProc(ref System.Windows.Forms.Message msg)
    {
        if (msg.Msg == 0x000a /* WM_ENABLE */ && msg.WParam == IntPtr.Zero)
        {
            EnableWindow(this.Handle, true);
            return;
        }

        base.WndProc(ref msg);
    }

答案 2 :(得分:1)

如果您需要另一种方法来运行多个UI线程,则可以处理WM_ENABLE消息并使用EnableWindow方法来阻止表单被禁用。

答案 3 :(得分:0)

一旦显示模态对话框,它将使同一STA线程上的所有其他窗口无法使用。这背后的原因是模态对话框将开始拦截该特定线程的所有消息。在模式对话框关闭之前,其他顶级窗口将无法响应。