Закрытие диспетчера задач не обнаруживается второй раз в приложении 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
чтобы поймать то же самое.