हां, यह संभव है। Application.Exit() विधि अनुप्रयोग में प्रपत्रों को पुन: सक्रिय करती है। ओपनफॉर्म संग्रह को उनके ऑनफॉर्मक्लोसिंग() विधि को कॉल करने के लिए। Winforms में एक बग है जो उस संग्रह को खुले रूपों का ट्रैक खो देता है। यह कोड इसे प्रदर्शित करता है:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
protected override void OnHandleCreated(EventArgs e) {
// Set breakpoint here:
base.OnHandleCreated(e);
}
protected override void OnMouseDown(MouseEventArgs e) {
this.ShowInTaskbar = !this.ShowInTaskbar;
MessageBox.Show(string.Format("There are {0} open forms", Application.OpenForms.Count));
Application.Exit();
}
protected override void OnFormClosing(FormClosingEventArgs e) {
MessageBox.Show("you won't see this");
base.OnFormClosing(e);
}
}
बग ट्रिगर करने के लिए फ़ॉर्म पर क्लिक करें। ध्यान दें कि यह 0 खुले रूपों की रिपोर्ट कैसे करता है और आपने कभी भी ऑनफॉर्म क्लोजिंग में प्रदर्शित संदेश बॉक्स को कैसे नहीं देखा।
यह ShowInTaskbar संपत्ति का असाइनमेंट है जो इसका कारण बनता है। ऐसी कई संपत्तियां हैं, मैंने ShowInTaskbar चुना क्योंकि यह एक ऐसा है जब आपके पास NotifyIcon है। राइट टॉफ्ट एक और है। ये गुण विशेष हैं क्योंकि उन्हें केवल तब निर्दिष्ट किया जा सकता है जब विंडो देशी CreateWindowEx() api फ़ंक्शन के साथ बनाई जाती है। उन्हें बदलने के लिए Winforms कुछ सुंदर वीर करने की आवश्यकता है, यह खिड़की को नष्ट कर देता है और इसे फिर से बनाता है। दुर्भाग्य से यह भी बग को ट्रिगर करता है, खिड़की को नष्ट करने से फॉर्म को ओपनफॉर्म संग्रह से हटा दिया जाता है और यह इसे वापस जोड़ना भूल जाता है।
इस स्निपेट से OnHandleCreated() विधि को अपने फॉर्म में कॉपी/पेस्ट करें और उस पर ब्रेकपॉइंट सेट करें। विंडो को पहली बार बनाया जाने पर इसे एक बार ट्रिगर करना होगा। जब यह फिर से ट्रिगर होता है और इस प्रकार बग परिदृश्य का आह्वान करता है तो आप यह देखने के लिए कॉल स्टैक को देख सकते हैं कि आपकी कक्षा में कौन सा कोड ट्रिगर हुआ है। आपको उस कोड को अक्षम करना होगा और इसे करने का दूसरा तरीका ढूंढना होगा। कन्स्ट्रक्टर में ShowInTaskbar प्रॉपर्टी सेट करना ठीक है, जब आप खिड़की के निर्माण के बाद इसे असाइन करते हैं तो यह केवल खराब हो जाता है, जैसे लोड इवेंट हैंडलर में।
स्रोत
2012-11-23 10:35:10
मुझे पता चला कि 'ShowInTaskbar = false;' 'application.Exit() '' फॉर्मक्लोसिंग 'ईवेंट को ट्रिगर नहीं करता था, जब आमतौर पर ऐसा होता था। –