线程中的TopMost表单?

我使用以下代码在新线程中打开一个表单:

private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(ThreadProc); thread.Start(); } public void ThreadProc() { Form form = new Form(); form.TopMost = true; form.ShowDialog(); } 

但是,即使我将其设置为true,新创建的表单也不是TopMost。

如何在线程TopMost中创建表单?

通常你不需要另一个线程,你可以像往常一样以模态或非模态模式打开表单,如果表单需要执行繁重的过程,那么你在线程内部执行该过程。

特定于您的问题,一个选项是从Application.Run运行表单,如此处所述。

 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(ThreadProc); thread.Start(); } public void ThreadProc() { using (Form1 _form = new Form1()) { _form.TopMost = true; Application.Run(_form); } } } 

这将启动一个带有自己的消息泵的新线程,并将其保留为TopMost表单。

我自己遇到了这个问题。 似乎如果表单有一个Owner ,那么TopMost按预期工作。 但是,如果拥有的表单是在另一个线程上创建的,那么设置它有点棘手 。 这是我用过的东西:

 var form = new Form(); form.Shown += (sender, e) => { Control.CheckForIllegalCrossThreadCalls = false; form.Owner = /* Owning form here */; form.CenterToParent(); // Not necessary Control.CheckForIllegalCrossThreadCalls = true; form.TopMost = true; // Works now! }; Application.Run(form); 
 private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(ThreadProc); thread.Start(); } public void ThreadProc() { Form form = new Form(); form.TopMost = true; this.Invoke((Action)delegate() { form.ShowDialog(); }); }