0

ユーザーが何らかの作業について通知する必要があるときにウィンドウを表示しようとしています。すべてがうまくいくと思いますが、私はフォームを絶対に一番上に表示したいと考えています。フォーム プロパティ TopMost = true を設定しましたが、機能しません。ウィンドウは他のフォームの背後に表示されたままです。

TopMost = true は BackgroundWorker でのみ機能しないことがわかりました。Timer クラスを使用すると正常に機能します。なぜだろう?誰でも私にこれを説明できますか?

これが私がやりたいことの簡単な例です。

    static void Main(string[] args)
    {
        try
        {
            BackgroundWorker worker = new BackgroundWorker();

            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.RunWorkerAsync();

            Application.Run(new Form());
        }
        catch (Exception exp)
        {
            Console.WriteLine(exp);
        }

    }

    static void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        while (true)
        {
            System.Threading.Thread.Sleep(1000);

            if (NeedNotify())
            {
                NotifyForm myNotifyForm = new NotifyForm();

                myNotifyForm.TopMost = true;
                myNotifyForm.ShowDialog(); // NotifyForm still show behind others windows
            }
        }
    }

    private static bool NeedNotify()
    {
        return true;
    }
}
4

1 に答える 1

1

バックグラウンド ワーカー内でフォームを作成すると、フォームが別のスレッドで作成されます。代わりに、を呼び出す前に、メイン スレッドでフォームを作成して表示しますRunWorkerAsync

アプリケーションのメインループが開始される前に「通知」を作成しているという事実から、別の問題が発生する可能性があります。メイン フォームのOnLoadイベントからバックグラウンド ワーカーが開始されるように、コードを再編成することを検討してください。

于 2013-06-06T14:01:31.940 に答える