我有一个C#WinForms程序可以启动另一个进程。程序然后等待,直到过程完成。
目前我使用的是Process.WaitForExit(),但这意味着当我的程序等待Process结束时,它不会重新绘制并“看起来”它没有响应。
我的程序启动的进程窗口是否有任何方法,对我的主窗体是模态的(即你不能切换回我的程序和窗口重绘)?
基本上我想做一些像Form.ShowDialog(),除了使用Process的窗口作为窗体显示为对话框。
答案 0 :(得分:1)
为什么不在单独的线程中启动进程?这样,只有你的线程会等待。这样,您的表单仍会响应。
答案 1 :(得分:1)
您无法阻止用户切换回来,因为您已经催生了一个单独的进程。就操作系统而言,就好像你通过它的桌面图标(例如)开始了第二个。
我认为您最希望的是在第二个进程处于活动状态时禁用相关的菜单/选项。您需要继续轮询以查看它是否仍然存在,否则您的主应用程序将无法使用。
另一种方法可能是最小化主要应用程序,这将使其不受影响。
答案 2 :(得分:0)
创建表单,显示模态。 然后使用BackgroundWorker启动进程并处理RunWorkerCompleted事件以关闭表单。
答案 3 :(得分:0)
你可以创建另一个你制作模态的表格。在那个表单加载上你会调用Visible = false;
然后你会启动一个线程来启动你的进程并等待它通过线程完成。
然后在等待完成后从线程中执行BeginInvoke(new MethodInvoker(delegate { Close(); } ));
。
答案 4 :(得分:0)
您应该最终创建一个新线程,然后从该线程启动您尝试启动的应用程序。这将使您的应用程序响应,即使在其他应用程序正在运行时也是如此
答案 5 :(得分:0)
答案 6 :(得分:0)
据我所知,这是不可能的。您可以使用SetParent(非托管)来设置子/父关系,但这是您可以去的地方。注意:我正在使用基于perl的程序,并且SetParent()例程似乎不像宣传的那样工作。
答案 7 :(得分:0)
另一种非标准的方法,但是可以使用。定义变量ProcessActive。在应用中可见的每个控件上,检查变量,如果已设置,请不要处理控件事件。在启动过程之前,将ProcessActive变量设置为True并启动带有事件的过程。在流程上定义Exited事件,以便将ProcessActive设置为False。他们可以切换回启动的应用程序,一切看起来不错。在该过程退出之前,它什么也不会做。您可能需要将光标设置到沙漏,以便他们知道该应用程序正忙。