لم يتم الكشف عن مدير المهام للمرة الثانية في تطبيق WinForms

StackOverflow https://stackoverflow.com/questions/2565041

سؤال

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top