我有一个使用show多个顶级窗口的Winforms应用程序:
Form1 form1 = new Form1();
form1.Show();
Form2 form2 = new Form2();
form2.Show();
Application.Run();
在Form1中的一个事件处理程序中,我希望能够显示一个模态对话框:
Dialog dialog = new Dialog();
dialog.ShowDialog(form1);
不暂停其他顶级窗口。
这可能吗?
答案 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线程上的所有其他窗口无法使用。这背后的原因是模态对话框将开始拦截该特定线程的所有消息。在模式对话框关闭之前,其他顶级窗口将无法响应。