2011-08-09 24 views
6

बंद करते समय बाल संवाद बंद करें मैं EZShellExtensions.NET का उपयोग कर सी # में एक विंडोज शैल एक्सटेंशन लिख रहा हूं।पैरेंट

मैं एक संदर्भ मेनू योगदान करता हूं जो संवाद दिखाता है।

मान लीजिए कि मैं एक एक्सप्लोरर विंडो (ए) दिखाता हूं। फिर मैं गैर मोडल विंडो (बी) दिखाने के लिए संदर्भ मेनू का उपयोग करता हूं।

विंडोज एक्सपी और विंडोज विस्टा में, जब मैं ए बंद करता हूं, बी बंद होता है (मुझे यह व्यवहार चाहिए)। हालांकि, विंडोज 7 में, जब मैं ए बंद करता हूं, बी बंद नहीं होता है लेकिन यह घटनाओं का जवाब नहीं देता है। मेरे प्रश्न हैं:

  • क्या आपको पता है कि विंडोज 7 शो फार्म को बाल रूप के रूप में क्यों प्रबंधित करता है?
  • अगर मैं ए बंद करता हूं तो संदेश लूप को बनाए रखने का कोई तरीका है?

संपादित: यदि मैं बी के मालिक, जब मैं एक करीबी के रूप में एक सेट, बी भी बंद कर दिया है। लेकिन यह new issue बनाता है। बी हमेशा ए

उत्तर

0

अंत में मैंने इसे निम्नलिखित तरीके से कार्यान्वित किया है। संवाद ShowDialog() का उपयोग करके दिखाया गया है लेकिन लॉन्च किया गया है (और धागे में बनाया गया है)। ShowDialog() अपना स्वयं का संदेश लूप लागू करता है, इसलिए फ़ॉर्म को थ्रेड में लॉन्च किया जाता है, मुख्य रूप घटनाओं का जवाब देता है, और आप मुख्य रूप को बंद कर सकते हैं और बच्चे का फॉर्म अभी भी घटनाओं का जवाब दे सकता है। यह शैल एक्सटेंशन अनुप्रयोग के लिए बहुत उपयोगी है।

थ्रेड को मुक्त करने के लिए, और खोल एक्सटेंशन थ्रेड (प्रत्येक खोल एक्सटेंशन विंडो और बच्चों को थ्रेड में निष्पादित किया जाता है) को अपने फॉर्म पर सभी को निपटाना याद रखें।

protected virtual void SetupViewControl() 
    { 
     ThreadPool.QueueUserWorkItem(new WaitCallback(DoSetupViewControl)); 

     while (!mViewControlCreated) 
     { 
      // wait for view control created 
      Thread.Sleep(100); 
     } 
    } 

    private bool mViewControlCreated = false; 

    protected virtual void DoSetupViewControl(object state) 
    { 
     mViewControl = ViewControlFactory.CreateViewControl(); 

     mViewControl.Dock = DockStyle.Fill; 
     mViewControl.Initialize(); 

     this.Controls.Clear(); 
     this.Controls.Add(mViewControl); 

     IntPtr wHnd = GetActiveWindow(); 
     IWin32Window owner = GetOwner(wHnd); 

     mViewControlCreated = true; 

     ShowDialog(owner); 

     this.Dispose(); 
    } 

    private IWin32Window GetOwner(IntPtr wHnd) 
    { 
     if (wHnd == IntPtr.Zero) return null; 

     return new WindowWrapper(wHnd); 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
    private static extern IntPtr GetActiveWindow(); 

    private class WindowWrapper : IWin32Window 
    { 
     private IntPtr mHwnd; 

     public WindowWrapper(IntPtr handle) 
     { 
      mHwnd = handle; 
     } 

     public IntPtr Handle 
     { 
      get { return mHwnd; } 
     } 
    } 
:

निम्नलिखित कोड मेरी समस्या का समाधान हो

संबंधित मुद्दे