块事件等待当进程退出
问题描述:
我在我启动其他应用程序APP2一个Windows C#应用程序APP1,通过点击一个按钮,具有:块事件等待当进程退出
var myProc = Process.Start("app2.exe", myArgs);
myProc.WaitForExit();//to wait I finish with app2.exe
这个伟大的工程,但我有另外两个问题app2已打开:
- 如果我点击任务栏中的app1图标,app1会到达正常位置,并且app2会背景。
- 如果我点击了app1中的按钮,相应的动作会在app2完成后执行。所以app1会在内存中保存我点击的按钮并执行之后的所有操作。
那么如何保持app2在前面,即使当我点击app1图标(我不确定它是可能的,因为app1和app2是完全不同的应用程序)?
对我来说更重要的是如何让app1在app2打开时不响应/保持内存事件?
答
一个解决方案是禁用第一个应用程序的所有窗口,只要该子进程正在运行。另外,可以将应用程序的主窗口设置为子应用程序打开的窗口的所有者(如果子应用程序显示任何窗口)。
如果您提供有关您正在使用的技术的更多详细信息,我们可以提供进一步的帮助。
答
可以使用
`myProcess.windowstyle`
设置启动APP 2最小化,或者如果我没有记错,甚至隐藏processWindowStyle.Hidden
。
您也可以将您在上面APP1使用
myForm.Topmost = true;
要确保您的应用程序不会再对使用按键的响应,您可以禁用按钮
myButton.Enabled = false;
就在您启动应用2之前,并在您的 myProcess.WaitForExit()
方法之后重新启用它们。
答
按照Dirk Vollmar的建议禁用表单,但也可以使用Async/await和Task.Run()在禁用时抽取队列。这会导致应用程序丢弃所有的用户输入,而形式是禁用的,而不是排队它,处理它的形式再次启用后:
private async void button1_Click(object sender, EventArgs e)
{
this.Enabled = false;
await Task.Run(() =>
{
var myProc = Process.Start("calc");
myProc.WaitForExit();
});
this.Enabled = true;
}
你刚才所描述的APP1开辟为您所需的模态窗口的行为行为。那么app2真的应该是一个独立的应用程序在你的情况? – 2014-12-02 11:50:39
不是真的,用普通的模态窗口,打开模态窗口的窗口不会接收事件,也不会在模态窗口打开时将它们保存在内存中。是的,app2必须是一个独立的应用程序。 – SteveTJS 2014-12-02 12:00:27