Как закрыть дочернее окно, используя Alt + F4?

Alt + F4 - это ярлык для закрытия формы. Когда я использую этот ярлык в среде MDI, приложение закрывается, поэтому очевидно, что ярлык применяется к "Контейнеру", а не к "Childform".

Какова была бы лучшая практика для захвата этого события и закрытия активного потомка вместо контейнера

я прочитал о регистрации Alt + F4 как горячей клавиши, когда MDI активируется. Когда MDI деактивируется, отменяется регистрация горячей клавиши. Таким образом, горячая клавиша не влияет на другие окна.

кто-то, может рассказать о регистрации Alt + F4 или что-то лучше

1 ответ

Решение

Вы можете изменить void Dispose(bool disposing) метод в вашей winform, чтобы вместо этого закрыть дочернюю форму, например так:

protected override void Dispose(bool disposing)
{
    if (/* you need to close a child form */)
    {
        // close the child form, maybe by calling its Dispose method
    }
    else
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }
}

РЕДАКТИРОВАТЬ: как сказал мой комментатор, вместо изменения переопределенного Dispose метод, вы должны просто переопределить OnFormClosing метод вместо этого, вот так:

protected override void OnFormClosing(FormClosingEventArgs e)
{
    if (/* you need to close the child form */)
    {
        e.Cancel = true;
        // close the child form, maybe with childForm.Close();
    }
    else
        base.OnFormClosing(e);
}

Поскольку на данный вопрос еще никто не ответил, это можно сделать, выполнив следующие два шага:

Шаг 1. Используйте эту простую логику, чтобы запустить закрытие дочерней формы MDI с помощью Alt+F4.

private void child_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Alt && e.KeyCode == Keys.F4) 
    {
        this.Close();
    }
}

Шаг 2. Также используйте этот прием, чтобы отключить эффекты Alt+, F4 влияющие на родительскую форму MDI.

private void parent_FormClosing(object sender, FormClosingEventArgs e)
{
    // note the use of logical OR instead of logical AND here
    if (Control.ModifierKeys == Keys.Alt || Control.ModifierKeys == Keys.F4) 
    { 
        e.Cancel = true;
        return;
    }    
}
Другие вопросы по тегам