C# 如何启动流程并使其主窗口成为启动流程的模态';窗户在哪里?

C# 如何启动流程并使其主窗口成为启动流程的模态';窗户在哪里?,c#,winforms,process,C#,Winforms,Process,我有一个C#WinForms程序,它启动了另一个进程。然后,程序将等待该过程完成 目前我使用Process.WaitForExit(),但这意味着当我的程序等待进程结束时,它不会重新绘制,并且“看起来”好像没有响应 我的程序启动的进程窗口是否有任何方式与我的主窗体相匹配(即,您不能切换回我的程序&窗口重新绘制) 基本上,我想做一些类似Form.ShowDialog()的事情,除了使用流程的窗口作为要显示为对话框的表单。创建表单,显示它。 然后使用BackgroundWorker启动流程并处理Ru

我有一个C#WinForms程序,它启动了另一个进程。然后,程序将等待该过程完成

目前我使用Process.WaitForExit(),但这意味着当我的程序等待进程结束时,它不会重新绘制,并且“看起来”好像没有响应

我的程序启动的进程窗口是否有任何方式与我的主窗体相匹配(即,您不能切换回我的程序&窗口重新绘制)


基本上,我想做一些类似Form.ShowDialog()的事情,除了使用流程的窗口作为要显示为对话框的表单。

创建表单,显示它。
然后使用BackgroundWorker启动流程并处理RunWorkerCompleted事件以关闭表单。

为什么不在单独的线程中启动流程?这样,只有您的线程将等待。这样,您的表单仍将响应。

您无法阻止用户切换回,因为您已经生成了一个单独的进程。就操作系统而言,就好像你已经通过它的桌面图标启动了第二个(例如)

我认为,当第二个进程处于活动状态时,您最好禁用相关的菜单/选项。您需要保持轮询以查看它是否仍然存在,否则您的主应用程序将无法使用


另一种方法可能是最小化主应用程序,这将使它不会碍事。

您可以创建另一个表单,使其成为模态。在该表单加载上,您将调用
Visible=false
然后您将启动一个线程,该线程启动您的进程并等待它通过该线程完成


然后执行
BeginInvoke(newmethodinvoker(委托{Close();}))

您应该明确创建一个新线程,然后从该线程启动您尝试启动的应用程序。这将使您的应用程序响应迅速,即使在其他应用程序正在运行时也是如此

  • 使用process.Exited事件了解应用程序何时退出
  • 钩住表单中激活的(认为它是正确的名称)事件。使用它来关注其他应用程序

  • 就我所知,这是不可能的。您可以使用SetParent(非托管)设置子/父关系,但这是您所能做到的。注意:我使用的是一个基于perl的程序,SetParent()例程似乎不像宣传的那样工作。

    另一种方法有点不标准,但它可以工作。定义变量ProcessActive。在应用程序中可见的每个控件上,检查变量,如果已设置,则不处理控件事件。在启动流程之前,请将ProcessActive变量设置为True,并使用事件启动流程。定义进程上的退出事件,以便将ProcessActive设置为False。他们可以切换回启动应用程序,一切看起来都很好。在进程退出之前,它不会做任何事情。您可能希望将光标设置为沙漏,以便他们知道应用程序正忙。

    您是否使用
    Chrome
    ?这是一个多进程但只有一个窗口。