Закрытие диспетчера задач не обнаруживается второй раз в приложении WinForms - PullRequest
4 голосов
/ 02 апреля 2010
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 ]

2 голосов
/ 02 апреля 2010

Я нашел тему с ответом от нашего собственного nobugz :

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

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

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

fi.SetValue(this, CloseReason.None);
0 голосов
/ 29 декабря 2011

Просто перевод вашего кода в 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

0 голосов
/ 02 апреля 2010

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

...