Как предотвратить разворачивание формы при отображении MessageBox? - PullRequest
0 голосов
/ 12 июля 2020

Ситуация

У меня есть форма

MyMainForm.Show()

, которая имеет подформу, которая не отображается модально

// Not modal, owner is MyMainForm
SubForm.Show(MyMainForm);

Пользователь minimizes подформой и взаимодействует с MyMainForm, то отображается MessageBox.

// SubForm is still opened, but minimized

// Owner is MyMainForm (same like the opened SubForm)
MessageBox.Show(MyMainForm, "Any message", ...);

Problem

Пользователь не щелкает MessageBox, а вместо этого maximizes SubForm.

Из-за того, что MessageBox все еще открыт (у которого тот же владелец!), SubForm не принимает никаких вводимых данных, и приложение, кажется, зависает .

Вопрос

Как я могу предотвратить максимизацию SubForm, когда отображается MessageBox с тем же владельцем?

(привязать MessageBox к подформе невозможно)

Что не работает

Я попытался распознать максимизацию, слушая Windows сообщений. Но когда отображается MessageBox, Windows Сообщение не отправляется!

public partial class SubForm : Form
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_SYSCOMMAND)
        {
            // Works well, except when the MessageBox is shown
            // then no appropriate message is sent
            
            ...
        }
    }
}

1 Ответ

1 голос
/ 12 июля 2020

Если я правильно понял вашу проблему, я бы попытался обработать событие Resize в SubForm таким образом

void onResize(object sender, EventArgs e)
{
    if(!this.CanFocus)
        this.WindowState = FormWindowState.Normal;
}

Этот подход, кажется, обрабатывает повторную активацию подчиненной формы, когда модальное окно сообщения отображается из формы владельца. Конечно, точное удобство использования зависит от того, насколько велик размер подчиненной формы по умолчанию. Он все еще может покрывать позицию MessageBox. Но вы все равно можете справиться с этим, изменив свойства Location и Size подчиненной формы в том же обработчике событий onResize или поэкспериментируйте с обходным путем, описанным в комментарии ниже Jimi

...