9

次のコードを使用して、新しいスレッドでフォームを開きます。

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 でフォームを作成するにはどうすればよいですか?

4

3 に答える 3

5

通常、別のスレッドは必要ありません。通常どおりモーダル モードまたは非モーダル モードでフォームを開きます。フォームが重いプロセスを実行する必要がある場合は、スレッド内でプロセスを実行します。

あなたの質問に固有のオプションの1つは、ここで説明されているように 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 フォームとして保持されます。

于 2011-01-20T07:05:59.403 に答える
2

自分でこの問題に遭遇しました。フォームに がある場合、期待どおりOwnerTopMost機能するようです。ただし、所有フォームが別のスレッドで作成された場合は、設定が少し面倒です。これが私が使用したものです:

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);
于 2011-08-18T13:10:03.157 に答える
-1

ShowDialog を直接呼び出す代わりに、this.Invoke を使用してフォームの所有権を取得してみてください。

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(); });
}
于 2016-06-16T18:07:29.560 に答える