C# Winforms: несколько окон верхнего уровня и ShowDialog ()

У меня есть приложение Winforms, которое использует несколько окон верхнего уровня:

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

Внутри одного из обработчиков событий в Form1 я хотел бы показать модальный диалог:

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

без приостановки другого окна верхнего уровня.

Это возможно?

Ответов (4)

Решение

Я считаю, что для этого вам нужно будет запускать каждое окно верхнего уровня в своем собственном потоке STA.

Как только вы покажете модальное диалоговое окно, все остальные окна в том же потоке STA станут непригодными для использования. Причина в том, что модальный диалог начнет перехватывать все сообщения для этого конкретного потока. Другие окна верхнего уровня не смогут отвечать, пока модальное диалоговое окно не будет закрыто.

Если вам нужен альтернативный метод для запуска нескольких потоков пользовательского интерфейса, вы можете обработать сообщение WM_ENABLE и использовать метод EnableWindow, чтобы предотвратить отключение формы.

Есть простое решение, которое, кажется, работает правильно. Вы можете просто проверить, отключены ли мы, и снова включить при необходимости.

    [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);
    }