我希望你能解决这个问题。
我正在使用按钮通过表单启动进程,然后等待进程关闭以便它恢复表单。问题是,当进程运行时,表单仍然是可点击的,但在关闭进程之前它不会执行任何操作。例如,如果进程正在运行并且我再次单击该按钮,那么我关闭该进程,它将在我按下按钮时再次启动。
所以,我不希望表单完全可以点击。
以下是代码:
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;
但无论出于何种原因,当流程结束时,表单会被最小化。
感谢。
答案 0 :(得分:2)
您的代码暗示当您调用WaitForExit()时主应用程序被阻止...这只会导致WM消息为您的应用程序排队,并且一旦您的消息泵再次获得CPU,它们将被处理。解决此问题的一种方法是使用BackgroundWorker线程,而不是在为您运行进程时阻止主应用程序。在启动工作线程之前,禁用主窗体,并在worker completed方法中重新启用主窗体。确保在启动工作线程时,您考虑的进程永远不会返回...实现此目的的一种方法是在您以合理的时间启动工作线程之前启动计时器,并且如果该计时器在线程完成之前到期取消它并重新启用UI。
以下是backgroundworker线程的文档,与您尝试实现的类似: http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx
答案 1 :(得分: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);
}
}
表格已停用并照常启用。
答案 2 :(得分:0)
如果你想使用一个线程,那么可能只是禁用控件而不是形式:
this.SetControlEnables(false);
something.Start();
something.WaitForExit();
this.SetControlEnables(true);
SetControlEnables将根据需要保存表单上的所有控件。