等待进程退出时阻止事件

本文关键字:事件 进程 退出 等待 | 更新日期: 2023-09-27 18:32:51

我有一个Windows C#应用程序app1,我在其中启动另一个应用程序app2,通过单击一个按钮,带有:

var myProc = Process.Start("app2.exe", myArgs);
myProc.WaitForExit();//to wait I finish with app2.exe

这很好用,但是打开app2时我有两个问题:

  1. 如果我单击任务栏中的 app1 图标,app1 会转到前面,这是正常的,而 app2 会转到后台。
  2. 如果我单击 app1 中的按钮,则在 app2 完成后执行相应的操作。因此,app1 将我单击的按钮保留在内存中,并在之后执行所有操作。

那么即使我点击了 app2 图标,如何让 app2 保持在前面(我不确定是否有可能,因为 app1 和 app2 是完全不同的应用程序)?

对我来说更重要的是,当打开 app1 时,如何使 app2 不响应/保留在内存中事件?

等待进程退出时阻止事件

一种解决方案是禁用第一个应用程序的所有窗口,只要子进程正在运行。此外,您可以将应用程序的主窗口设置为子应用程序打开的窗口的所有者(如果子应用程序显示任何窗口)。

如果您提供有关您正在使用的技术的更多详细信息,我们可以提供进一步的帮助。

您可以使用

 `myProcess.windowstyle` 

设置以最小化启动您的 app2,或者如果我没记错的话,甚至是隐藏的processWindowStyle.Hidden.

您还可以

使用

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.WindowState = FormWindowState.Minimized;
Task t = YourProcess();
t.Wait();
app1.WindowState = FormWindowState.Maximized;

您的任务

private Task YourProcess()
{
   return Task.Run(() => {
    var myProc = Process.Start("app2.exe", myArgs);
    myProc.WaitForExit();
    });    
}