2016-07-28 4 views
0

Есть ли способ предотвратить закрытие окна 7za.exe во время его процесса? Мне нужно показать прогрессию извлечения папки, но если пользователь закроет окно, это может вызвать некоторые ошибки в моей программе на C#.Избегайте закрытия программы 7za.exe до завершения процесса

public partial class ExtractForm : Form 
{ 
    public ExtractForm() 
    { 
     InitializeComponent(); 
    } 

    private void ExtractForm_Load(object sender, EventArgs e) 
    { 
     InitializeEvent(); 
    } 

    private void InitializeEvent() 
    { 
     Zip.LogFileExtract +=WriteExtractProgression; 
    } 

    private void WriteExtractProgression(string text) 
    { 
     if (InvokeRequired) 
     { 
      this.BeginInvoke(new Action<string>(WriteExtractProgression), text); 
     } 
     else 
     { 
      txtExtract.Text += text; 
      txtExtract.SelectionStart = txtExtract.TextLength; 
      txtExtract.ScrollToCaret(); 
      txtExtract.Refresh(); 
     } 
    } 
} 

метод процесс:

ExtractForm extractForm = new ExtractForm(); 
extractForm.Show(); 

Process zipProcess = new Process(); 
     using (zipProcess) 
     { 
      zipProcess.StartInfo.UseShellExecute = false;   //Show the cmd. 
      zipProcess.StartInfo.RedirectStandardOutput = true; 
      zipProcess.OutputDataReceived += (object sender, DataReceivedEventArgs outline) => 
      { 
       LogFileExtract(outline.Data); 
       // Add args to a TextBox, ListBox, or other UI element 
      }; 
      zipProcess.StartInfo.CreateNoWindow = true; 
      zipProcess.StartInfo.FileName = pathToZip; 
      zipProcess.StartInfo.Arguments = args; 
      zipProcess.Start(); 
      zipProcess.BeginOutputReadLine(); 
      zipProcess.WaitForExit(); //Wait the process to finish completely. 

     } 
     extractForm.Close(); 
    } 
+0

http://stackoverflow.com/questions/5377423/hide-console-window-from-process-start-c-sharp это дает вам ответ? – Will

+0

Нет, я хочу консольное окно, но я не хочу, чтобы пользователь сам закрывал окно консоли –

+0

Тогда вы, вероятно, SOL. – Will

ответ

1

Там нет прямого способа предотвратить закрытие внешнего окна, которое окно консоли, даже если вы начали его.

Для этого конкретного случая использования, вы можете получить вывод процесса вы начали использовать что-то вроде:

process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.OutputDataReceived += (sender, args) => 
{ 
    // Add args to a TextBox, ListBox, or other UI element 
} 
process.Start(); 
process.BeginOutputReadLine(); 

Это даст вам прямой контроль над элементами пользовательского интерфейса. В качестве бонуса нет никаких шансов, что консольное окно потеряется за вашим приложением во время его работы.

+0

Да, но процесс может длиться несколько минут, и если я не покажу консольное окно, клиент спросит его, если что-то пойдет не так. –

+0

Действительно, клиент будет не в порядке с просмотром вывода процесса в окне, которое вы контроль? Вы даже можете сделать TextBox смутно похожим на консольное окно, если хотите. –

+0

Лучше всего было бы сделать индикатор выполнения, но я не думаю, что смогу с программой 7za. С вашим кодом я могу получить прогресс и написать в своем winform, как я вижу. Это лучшее, что я не могу сделать, вероятно. Спасибо :) –