关闭子窗口(在另一个进程中)正在关闭父窗口

时间:2015-09-15 20:05:41

标签: .net winforms

情况有点不寻常,因为儿童表格处于不同的过程中:

  1. 父窗口是进程中的唯一表单" A"。
  2. 单击“运行”按钮时,新进程" B"是和父母一起开始的 窗口句柄作为命令行参数传递。

    ProcessStartInfo command = new ProcessStartInfo();
    string thisProgramsPath = (new Uri(Assembly.GetExecutingAssembly().CodeBase)).LocalPath;
    command.FileName = thisProgramsPath;
    command.UseShellExecute = false; // Prevents "Publisher cannot be verified" in Citrix.
    // Command Line Args
    StringBuilder args = new StringBuilder();
    if (ParentWorkerCheckbox.Checked) args.AppendFormat("-p {0} ", this.Handle);
    command.Arguments = args.ToString();
    Process.Start(command);
    
  3. 进程B创建一个工作表单,显示长时间运行的进程的进度。它使用ShowDialog显示,并以进程A的主窗体为父级。

    NativeWindow parent = new NativeWindow();
    parent.AssignHandle(pointer);
    form.ShowDialog(parent);
    
  4. 工作完成后,工作表单上会显示一个关闭按钮。单击时,将设置DialogResult,关闭表单。

    private void CloseButton_Click(object sender, EventArgs e)
    {
        Owner = null;
        this.DialogResult = _result;
    }
    
  5. 进程A中的主窗体也关闭,应用程序退出!

  6. 我可以显示工作表单而不将其父化为主表单,然后在不关闭主表单的情况下关闭它,但我更愿意将其设置为父表单,以便始终保持在主表单的顶部。

    我不明白为什么在子表单关闭时主表单会被关闭,因为这不是子表单在同一进程中成为父级时关闭的行为。有谁知道它为什么会这样做和/或如何阻止它关闭主窗体?

1 个答案:

答案 0 :(得分:1)

不要使用NativeWindow,请尝试使用:

private class SimpleWindow : System.Windows.Forms.IWin32Window {
    IntPtr h = IntPtr.Zero;
    public SimpleWindow(IntPtr ptr) {
        h = ptr;
    }
    public IntPtr Handle {
        get { return h; }
    }
}

我的猜测是清理过程的一部分,当第二个进程退出时,清理任何已分配的句柄。