Закрытие диспетчера задач не обнаруживается второй раз в приложении WinForms

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        if (MessageBox.Show(this, "Do you really want to close?", "Close?", 
                            MessageBoxButtons.YesNo) == DialogResult.No)
        {
            e.Cancel = true;
        }
    }
}

Поэтому, когда я хочу закрыть приложение, нажав кнопку "Закрыть", окно сообщения отображается так, как должно, тогда я выбрал "нет". Затем выполняется строка e.Cancel = true и форма не закрывается.

Теперь дело в том, что после этого, если я закрою приложение из диспетчера задач, причина закрытия - UserClosing!!! Зачем? Разве это не должен быть TaskManagerClosing?

3 ответа

Решение

Я нашел ветку с ответом нашего собственного Hans Passant:

Windows Forms не может обнаружить, что причина закрытия пришла из диспетчера задач. Таким образом, он автоматически переводит CloseReason.None в CloseReason.Task ManagerClosing. Проблема в том, что после того, как вы попытались закрыть с помощью "X", CloseReason устанавливается на UserClosing и не возвращается к None, если вы отменяете закрытие. Слоппи.

И рядом с ним, объяснение другого пользователя о том, как изменить значение e.CloseReason на None, используя Reflection (так как оно доступно только для чтения), чтобы обойти эту проблему (это следует применять при установке e.Cancel в True):

FieldInfo fi = typeof(Form).GetField("closeReason", BindingFlags.Instance | BindingFlags.NonPublic);

fi.SetValue(this, CloseReason.None);

Просто перевод вашего кода в VB:

Imports System.Reflection
Private Sub ResetCloseReason()
  Dim myFieldInfo As FieldInfo
  Dim myType As Type = GetType(Form)
  myFieldInfo = myType.GetField("closeReason", BindingFlags.NonPublic Or _
                    BindingFlags.Instance Or BindingFlags.Public)
  myFieldInfo.SetValue(Me, CloseReason.None)

End Sub

Смотрите ответ на этот вопрос, который использует CloseReason.TaskManagerClosing чтобы поймать то же самое.

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