2

複数のトップレベル ウィンドウを表示する Winforms アプリケーションがあります。

Form1 form1 = new Form1();
form1.Show();
Form2 form2 = new Form2();
form2.Show();
Application.Run();

Form1 のイベント ハンドラーの 1 つの中で、モーダル ダイアログを表示できるようにしたいと考えています。

Dialog dialog = new Dialog();
dialog.ShowDialog(form1);

他のトップレベル ウィンドウを中断せずに。

これは可能ですか?

4

4 に答える 4

5

それを実現するには、各トップレベル ウィンドウをそれぞれの STA スレッドで実行する必要があると思います。

于 2009-02-24T12:11:10.313 に答える
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);
    }
于 2011-08-17T12:49:33.677 に答える
1

複数の UI スレッドを実行する別の方法が必要な場合は、WM_ENABLEメッセージを処理し、EnableWindowメソッドを使用してフォームが無効にならないようにすることができます。

于 2009-02-24T12:42:41.580 に答える
0

モーダル ダイアログを表示すると、同じ STA スレッド上の他のすべてのウィンドウが使用できなくなります。この背後にある理由は、モーダル ダイアログがその特定のスレッドのすべてのメッセージをインターセプトし始めるためです。モーダル ダイアログが閉じられるまで、他のトップ レベル ウィンドウは応答できません。

于 2009-02-24T12:44:27.050 に答える