2012-11-13 20 views
10

बंद करने में बनाम window.Close() वहाँ पता लगाने के लिए कि क्या एक खिड़की के पासकैसे भेद करने के लिए 'विंडो बंद करें बटन क्लिक (एक्स)' हैंडलर

  • बंद हो गया (एक्स दबाने एक उपयोगकर्ता एक चालाक रास्ता है) विंडो के ऊपरी दाएं कोने में बटन या
  • विंडो। बंद करें() को प्रोग्रामिक रूप से बुलाया गया है।

मैं इसे विंडो में पहचानना चाहता हूं। हैंडलर बंद करना। जब भी मैं विंडो कॉल करता हूं तो मैं ध्वज सेट कर सकता हूं। बंद करें(), लेकिन यह एक बहुत ही सुंदर समाधान नहीं है।

+0

जबकि यह संभव हो सकता है, यह उन्हें अलग ढंग से इलाज करने के लिए एक अच्छा विचार की तरह प्रतीत नहीं होता है .. देखने के एक UX बिंदु से, Alt-F4/फ़ाइल-> क्लोज़ बटन के साथ बाहर निकलें/बंद करना प्रोग्रामेटिक रूप से बंद होना चाहिए .. – stijn

+1

मुझे लगता है कि जब आप एक बच्चे की खिड़की को छिपाने के लिए बंद बटन दबाते हैं तो यह समझ में आता है, लेकिन एप्लिकेशन बंद होने पर बच्चे की खिड़की को बंद करना पसंद है बटन दबाया जाता है। – resp78

उत्तर

12

मुझे यकीन नहीं है कि मुझे यह बिल्कुल पसंद है लेकिन यह एक प्रश्न है कि आपके पास स्पष्ट रूप से पूछने का कारण है। यदि आप ऑनक्लोज़िंग ईवेंट में स्टैक ट्रेस लेना चाहते थे तो आप विंडो के लिए देख सकते थे। ईवेंट बंद करें।

Window.Close() का कारण बनता है WM_CLOSE खिड़की को भेजने जा रहे हैं:

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
{ 
    bool wasCodeClosed = new StackTrace().GetFrames().FirstOrDefault(x => x.GetMethod() == typeof(Window).GetMethod("Close")) != null; 
    if (wasCodeClosed) 
    { 
     // Closed with this.Close() 
    } 
    else 
    { 
     // Closed some other way. 
    } 

    base.OnClosing(e); 
} 
3

अंतर निम्नलिखित है।

Alt + F4 और X बटन SC_CLOSE प्रकार के साथ WM_SYSCOMMAND संदेश का कारण बनता है। आप यह तय कर सकते हैं कि क्या आप इस संदेश को आगे बढ़ाना चाहते हैं (और अंत में WM_CLOSE का कारण बनें)।

इस संदेश को पकड़ने के लिए यहां कोड का एक टुकड़ा है। प्रतिनिधि से "सही" लौटें यदि आप डिफ़ॉल्ट व्यवहार को रद्द करना चाहते:

class SystemMenu : IDisposable 
{ 
    const int WM_SYSCOMMAND = 0x0112; 
    const int SC_CLOSE = 0xF060; 

    public delegate bool HandleSystemCommand(); 
    HwndSource _source; 
    HandleSystemCommand _handler; 

    public SystemMenu(Window window, HandleSystemCommand handler) 
    { 
     _handler = handler; 
     _source = HwndSource.FromHwnd(new WindowInteropHelper(window).Handle); 
     _source.AddHook(WndProc); 
    } 

    public void Dispose() { 
     _source.RemoveHook(WndProc); 
    } 

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
    { 
     switch (msg) 
     { 
      case WM_SYSCOMMAND: 
       int command = wParam.ToInt32() & 0xfff0; 
       if (command == SC_CLOSE) 
        handled = _handler(); 
       break; 
      default: 
       break; 
     } 
     return IntPtr.Zero; 
    } 
} 
संबंधित मुद्दे