Проверка, если WinForm C# закрыт

Я использую событие FormClosing в C# Windows Form, чтобы попросить пользователя подтвердить перед выходом. Я хочу показать это сообщение, только если пользователь специально закрыл форму, используя красный крестик в углу окна формы. Когда я закрываю или скрываю форму вручную, я не хочу показывать подтверждающее сообщение (например, вручную вызывая form.Close()).

Можно ли проверить, нажал ли пользователь красный крестик?

Благодарю.

5 ответов

Решение

Проверьте свойство FormClosingEventArgs.CloseReason.

Если вы программно позвоните this.Close() или пользователь нажимает X, вы получаете CloseReason.UserClosing для обоих, так что это не действительная проверка.

Посмотрите код ниже для "хакерского" решения, которое в основном вызывает это. Закройте, если OnClosing передан null параметр.

private void button1_Click(object sender, EventArgs e)
{
    OnClosing(null);
}
protected override void OnClosing(CancelEventArgs e)
{
    if (e == null)
    {
        // Raise your Message or Cancel
        this.Close();
    }
    else
    {
        base.OnClosing(e);
    }
}

Вы можете проверить CloseReason свойство аргументов события, переданных FormClosing событие.

Использование FormClosing обработчик событий и поместите этот простой код:

        if (MessageBox.Show(this, "Do you want to close the Application?", "Exit App", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
        {
            e.Cancel = true;
        }
        else
        {
            //close app code
        }

Из коробки нет простого способа обнаружить такое поведение. Хотя есть свойство "FormClosingEventArgs.CloseReason", которое вы можете проверить в событии FormClosing, на самом деле оно не будет конкретно указывать причину закрытия.

Из MSDN описание значения перечисления UserClosing:

Пользователь закрывает форму через пользовательский интерфейс, например, нажимая кнопку "Закрыть" в окне формы, выбирая "Закрыть" в меню управления окна или нажимая ALT+F4.

Итак, как вы можете видеть, есть много причин, но не одна конкретно.

Я думаю, что лучшее, что вы собираетесь сделать, - это удалить границу окна (включая кнопки) и поместить на нее свою собственную кнопку закрытия, и перехватить событие щелчка, чтобы получить желаемое поведение. Я видел, как это было сделано раньше, и оно работает, хотя может выглядеть не так хорошо, как обычные кнопки окна.

Другие вопросы по тегам