0

我希望你能帮助我解决这个问题。

我正在使用按钮通过表单启动一个进程,然后它会等到进程关闭以便恢复表单。问题是当进程运行时表单仍然是可点击的,但在进程关闭之前它不会做任何事情。例如,如果进程正在运行并且我再次单击按钮,然后我关闭进程,它将再次启动,因为我在运行时按下按钮。

所以,我根本不希望表单是可点击的。

这是代码:

private void button1_Click(object sender, EventArgs e)
{
    var something = new Process
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = "something.exe"
        }
    };

    if (File.Exists("something.exe"))
    {
        something.Start();
        something.WaitForExit();
    }
    else
    {
        MessageBox.Show("Message.", "Title", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

我也尝试过:

            this.Enabled = false;
            something.Start();
            something.WaitForExit();
            this.Enabled = true;

但无论出于何种原因,当进程关闭时,表单会被最小化。

谢谢。

4

3 回答 3

2

您的代码暗示当您调用 WaitForExit() 时主应用程序被阻塞......这只会导致 WM 消息为您的应用程序排队,一旦您的消息泵再次获得 CPU,它们将得到处理。解决此问题的一种方法是使用 BackgroundWorker 线程,并且在主应用程序为您运行进程时不要阻塞它。就在您启动工作线程之前,禁用主窗体,并在工作完成方法中重新启用主窗体。确保当您启动工作线程时,您说明进程永远不会返回...实现此目的的一种方法是在启动工作线程之前启动一个计时器,并在合理的时间内启动计时器,如果该计时器在线程完成之前到期取消它并重新启用 UI。

这是与您尝试实现的相似的背景工作线程的文档:http: //msdn.microsoft.com/en-us/library/cc221403 (v=vs.95).aspx

于 2013-04-12T01:17:15.167 回答
1

该表单已最小化,因为您的进程正在打开一个控制台来执行。所以你需要做的是在没有控制台的情况下执行这个过程。请参阅ProcessStartInfo

private void button1_Click(object sender, EventArgs e)
{
    var something = new Process {
        StartInfo = new ProcessStartInfo {
            FileName = "something.exe",
            CreateNoWindow=true,
            UseShellExecute=false
        }
    };

    if (File.Exists("something.exe")) {
        this.Enabled = false;
        something.Start();
        something.WaitForExit();
        this.Enabled = true;
    } else {
        MessageBox.Show("Message.", "Title", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

该表单像往常一样被禁用和启用。

于 2013-04-12T01:17:26.873 回答
0

如果您想使用线程,那么可能只是禁用控件而不是以下形式:

        this.SetControlEnables(false);
        something.Start();
        something.WaitForExit();
        this.SetControlEnables(true);

SetControlEnables 将根据需要保存表单启用或禁用上的所有控件。

于 2013-04-12T01:32:47.370 回答