关闭父级时关闭子对话框

Dan*_*lba 6 .net c# shell-extensions winforms

我正在使用EZShellExtensions.NET在C#中编写Windows shell扩展.

我提供了一个显示对话框的上下文菜单.

假设我显示了一个资源管理器窗口(A).然后我使用上下文菜单显示非模态窗口(B).

在Windows XP和Windows Vista中,当我关闭A时,B关闭(我想要这种行为).但是,在Windows 7中,当我关闭A时,B未关闭但它不响应事件.我的问题是:

  • 你知道为什么Windows 7将显示的表单作为子表单管理吗?
  • 如果我关闭A,有没有办法维护消息循环?

编辑:如果我将A设为B的所有者,当我关闭A时,B也会关闭.但它创造了一个新问题.B总是在A.

Dan*_*lba 0

最后我通过以下方式实现了它。该对话框显示使用ShowDialog()但已启动(并在线程中创建)。ShowDialog()实现自己的消息循环,因此当表单在线程中启动时,主表单响应事件,并且您也可以关闭主表单,子表单仍然响应事件。这对于 ShellExtension 应用程序非常有用。

请记住在表单上释放所有内容,以便释放线程以及 shell 扩展线程(每个 shell 扩展窗口和子窗口都在一个线程中执行)。

以下代码解决了我的问题:

    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; }
        }
    }
Run Code Online (Sandbox Code Playgroud)