我有一个使用显示多个顶级窗口的 Winforms 应用程序:
Form1 form1 = new Form1();
form1.Show();
Form2 form2 = new Form2();
form2.Show();
Application.Run();
在 Form1 中的一个事件处理程序中,我希望能够显示一个模式对话框:
Dialog dialog = new Dialog();
dialog.ShowDialog(form1);
不暂停其他顶级窗口。
这可能吗?
我有一个使用显示多个顶级窗口的 Winforms 应用程序:
Form1 form1 = new Form1();
form1.Show();
Form2 form2 = new Form2();
form2.Show();
Application.Run();
在 Form1 中的一个事件处理程序中,我希望能够显示一个模式对话框:
Dialog dialog = new Dialog();
dialog.ShowDialog(form1);
不暂停其他顶级窗口。
这可能吗?
我相信,您需要在其自己的 STA 线程上运行每个顶级窗口来实现这一点。
有一个简单的解决方案似乎可以正常工作。您可以简单地检查我们是否被禁用并在需要时重新启用。
[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);
}
如果您需要另一种方法来运行多个 UI 线程,您可以处理WM_ENABLE消息并使用EnableWindow方法来防止窗体被禁用。
一旦显示模态对话框,它将使同一 STA 线程上的所有其他窗口不可用。这背后的原因是模式对话框将开始拦截该特定线程的所有消息。在模式对话框关闭之前,其他顶级窗口将无法响应。