2011-08-09 45 views
6

Tôi đang viết phần mở rộng vỏ Windows trong C# bằng cách sử dụng EZShellExtensions.NET.Đóng các hộp thoại con khi đóng phụ huynh

Tôi đóng một menu ngữ cảnh hiển thị hộp thoại.

Giả sử tôi hiển thị cửa sổ Explorer (A). Sau đó, tôi sử dụng trình đơn ngữ cảnh để hiển thị cửa sổ không theo phương thức (B).

Trong Windows XP và Windows Vista, khi tôi đóng A, B bị đóng (Tôi muốn hành vi này). Tuy nhiên, trong Windows 7, khi tôi đóng A, B không bị đóng nhưng nó không phản hồi các sự kiện. Câu hỏi của tôi là:

  • Bạn có biết tại sao Windows 7 quản lý biểu mẫu được hiển thị dưới dạng biểu mẫu con không?
  • Có cách nào để duy trì vòng lặp tin nhắn nếu tôi đóng A không?

EDIT: Nếu tôi đặt làm chủ sở hữu của B, khi tôi đóng A, B cũng bị đóng. Nhưng nó tạo ra một new issue. B luôn hơn A.

Trả lời

0

Cuối cùng tôi đã triển khai nó theo cách sau. Hộp thoại được hiển thị bằng cách sử dụng ShowDialog() nhưng được khởi chạy (và được tạo trong một chuỗi). ShowDialog() thực hiện vòng lặp thông báo của riêng nó, vì biểu mẫu được khởi chạy trong một chuỗi, biểu mẫu chính phản hồi sự kiện và bạn cũng có thể đóng biểu mẫu chính và biểu mẫu con vẫn phản hồi sự kiện. Điều này rất hữu ích cho một ứng dụng ShellExtension.

Nhớ vứt bỏ tất cả trên biểu mẫu của bạn, để giải phóng chuỗi và cũng là chuỗi tiện ích mở rộng vỏ (mỗi cửa sổ tiện ích mở rộng và con được thực hiện trong một chuỗi).

Mã sau đã khắc phục sự cố của tôi:

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; } 
     } 
    } 
Các vấn đề liên quan