情况有点不寻常,因为儿童表格处于不同的过程中:
单击“运行”按钮时,新进程" 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);
进程B创建一个工作表单,显示长时间运行的进程的进度。它使用ShowDialog显示,并以进程A的主窗体为父级。
NativeWindow parent = new NativeWindow();
parent.AssignHandle(pointer);
form.ShowDialog(parent);
工作完成后,工作表单上会显示一个关闭按钮。单击时,将设置DialogResult,关闭表单。
private void CloseButton_Click(object sender, EventArgs e)
{
Owner = null;
this.DialogResult = _result;
}
进程A中的主窗体也关闭,应用程序退出!
我可以显示工作表单而不将其父化为主表单,然后在不关闭主表单的情况下关闭它,但我更愿意将其设置为父表单,以便始终保持在主表单的顶部。
我不明白为什么在子表单关闭时主表单会被关闭,因为这不是子表单在同一进程中成为父级时关闭的行为。有谁知道它为什么会这样做和/或如何阻止它关闭主窗体?
答案 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; }
}
}
我的猜测是清理过程的一部分,当第二个进程退出时,清理任何已分配的句柄。