لم يتم الكشف عن مدير المهام للمرة الثانية في تطبيق WinForms
-
23-09-2019 - |
سؤال
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 ولا يتم إغلاق النموذج.
الآن الشيء هو ، بعد ذلك إذا أغلقت التطبيق من مدير المهام ، فإن السبب الوثيق هو استخدام المستخدم !!! لماذا ا؟ ألا يجب أن يكون TaskManagerClosing؟
المحلول
لقد وجدت ال مسلك مع إجابة من قبلنا نوبوجز:
لا يمكن أن تكتشف نماذج Windows أن السبب الوثيق جاء من مدير المهام. لذلك فهو يترجم تلقائيًا عن قرب. المشكلة هي ، بمجرد أن تحاول الإغلاق مع "X" ، يتم تعيين أقرباء إلى استخدام المستخدم ولا يتم إعادة تعيينه إلى لا شيء إذا قمت بإلغاء الإغلاق. قذرة.
وبجوار ذلك ، شرح من قبل مستخدم آخر حول كيفية تغيير قيمة E.Closereason التي لا تستخدم فيها التفكير (نظرًا لأنه قارئ فقط) ، للعمل على هذا المشكلة (يجب تطبيق هذا عند إعداد E.Cancel إلى True) :
FieldInfo fi = typeof(Form).GetField("closeReason", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, CloseReason.None);
نصائح أخرى
انظر إجابه لهذا السؤال الذي يستخدم CloseReason.TaskManagerClosing
للقبض على نفس الشيء.
مجرد ترجمة رمز لك في 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