使用c#在进程运行时冻结表单

本文关键字:冻结 表单 运行时 进程 使用 | 更新日期: 2023-09-27 18:08:59

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

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

我不希望这个表单是可点击的

代码如下:

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;

但是由于某种原因,当进程关闭时,表单被最小化了。

谢谢。

使用c#在进程运行时冻结表单

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

以下是与backgroundworker线程的文档,类似于你想要实现的:http://msdn.microsoft.com/en-us/library/cc221403 (v = vs.95) . aspx

窗体被最小化,因为您的进程正在打开一个控制台来执行。因此,您需要做的是在没有控制台的情况下执行进程。参见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);
    }
}

如果你想使用线程,那么也许只是禁用控件而不是窗体,比如:

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

其中setcontrolenable将根据需要保存表单上的所有控件Enable或Disable