2

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

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

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

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

不暂停其他顶级窗口。

这可能吗?

4

4 回答 4

5

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

于 2009-02-24T12:11:10.313 回答
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);
    }
于 2011-08-17T12:49:33.677 回答
1

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

于 2009-02-24T12:42:41.580 回答
0

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

于 2009-02-24T12:44:27.050 回答