Проверка, если WinForm C # закрыт - PullRequest
3 голосов
/ 22 февраля 2012

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

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

Спасибо.

Ответы [ 5 ]

3 голосов
/ 22 февраля 2012

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

2 голосов
/ 22 февраля 2012

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

См. Приведенный ниже код для "хакерского" решения, котороев основном вызывает this.Close, если 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);
    }
}
0 голосов
/ 22 февраля 2012

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

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

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

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

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

0 голосов
/ 22 февраля 2012

используйте 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
        }
0 голосов
/ 22 февраля 2012

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

...