使用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;
但是由于某种原因,当进程关闭时,表单被最小化了。
谢谢。
你的代码暗示主应用程序被阻塞当你调用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