您可以通过创建一个 STA 线程并使用Application.Run()
来显示来自该单独线程的表单来做到这一点。Application.Run()
将为其他表单创建一个单独的消息泵;这就是让它分开的原因。
如果这样做,则在表单之间进行通信时必须非常小心。您将需要使用Control.Invoke()
或其他一些线程间机制来从第一个表单调用第二个表单上的 UI 更改方法(反之亦然)。
但是如果你这样做,那么第一个表单可以显示一个模态对话框,而第二个表单仍然是可聚焦的。
请注意,第二个窗口可能在第一个窗口之后,因为无法指定它们之间的相对 Z 顺序。
显示第二种形式可以这样完成:
private static void ShowIndependentForm()
{
Thread thread = new Thread(ShowIndependentFormImpl);
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
}
private static void ShowIndependentFormImpl()
{
Application.Run(new Form2());
}
您可以在适当的地方调用 ShowIndependentForm() ;可能在您创建它之后来自主窗体,但我的测试代码Main()
如下所示:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ShowIndependentForm();
Application.Run(new Form1());
}
重要的
因为第二个表单有自己的消息泵,所以关闭第一个表单不会关闭程序,除非您设置Thread.IsBackground
为 true。如果不这样做,Control.Invoke()
如果您希望程序自动关闭,则必须在第一个表单关闭时显式关闭第二个表单(通过使用或其他方式调用第二个表单中的方法)。