Administrador de tareas de cierre no se detecta por segunda vez en una aplicación Windows Forms
-
23-09-2019 - |
Pregunta
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;
}
}
}
Así que cuando quiero cerrar la aplicación haciendo clic en el botón de cerrar el cuadro de mensaje se muestra como debe ser, entonces no he escogido. Entonces se ejecuta la línea e.Cancel = true y el formulario no está cerrado.
Ahora la cosa es, después de esto, si cierro la aplicación de administrador de tareas de la razón está cerca UserClosing !!! ¿Por qué? ¿No debería ser TaskManagerClosing?
Solución
He encontrado un href="http://dotnet.itags.org/web-forms/86331/" rel="nofollow hilo con una respuesta por nuestro propio nobugz :
FormasWindows no puede detectar que el Cerrar razón vino de la Tarea Gerente. Por lo tanto, de forma automática traduce a CloseReason.None CloseReason.TaskManagerClosing. El problema es que, una vez que se trató de cerrar con la "X", la CloseReason es conjunto a UserClosing y no reconfiguradas Ninguna copia a si se cancela el cierre. Descuidado.
Y junto a ella, una explicación por otro usuario sobre cómo cambiar el valor de e.CloseReason a Ninguno usando Reflexión (ya que es de sólo lectura), para trabajo en torno a este problema (esto se debe aplicar al establecer e.Cancel True):
FieldInfo fi = typeof(Form).GetField("closeReason", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, CloseReason.None);
Otros consejos
Vea la respuesta a esta pregunta qué usos < a href = "http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx" rel = "nofollow noreferrer"> CloseReason.TaskManagerClosing
para capturar la misma.
Al igual que la traducción del código en 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