关闭父对话框时关闭子对话框

6
我正在使用EZShellExtensions.NET用C#编写Windows shell扩展程序。
我贡献了一个上下文菜单,显示对话框。
假设我显示了一个资源管理器窗口(A)。然后我使用上下文菜单来显示非模态窗口(B)。
在Windows XP和Windows Vista中,当我关闭A时,B也会关闭(我希望这种行为)。然而,在Windows 7中,当我关闭A时,B没有关闭但是它不响应事件。我的问题是:
  • 你知道为什么Windows 7将显示的窗体视为子窗体吗?
  • 如果我关闭A,有没有一种方法可以维护消息循环?
编辑:如果我将A设置为B的所有者,则关闭A时,B也会关闭。但是它会创建一个new issue。B始终位于A之上。
1个回答

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; }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接