Я хочу получить консольное окно в моей форме. Обычно, когда вы нажимаете button1, запускается пакетный сценарий (test.exe). Мне не нужно отдельное окно пакета, но я хочу, чтобы оно отображалось в моей форме.
Я полагаю, что есть, вероятно, два способа сделать это: либо 1, каким-то образом встроить консоль в мою форму, либо 2, установить StartInfo.CreateNoWindow = true;, когда вы щелкнете button1 и получите вывод в воронку в список для имитации консоли в моей форме.
Я просто немного застрял, потому что я нашел методы для выполнения обоих, но мое собственное тестирование с различными другими методами, которые предлагали люди, ничего не сработало. Но в любом случае мой пользователь должен иметь возможность отправлять ввод обратно на консоль.
Какой метод будет проще и как мне это сделать?
@JNevill Да, но я не могу заставить его работать даже с совершенно новым проектом. Если я чего-то не понимаю, половина установочного кода, который дает парень, - это просто переменные, которые либо нигде не определены, либо код, который не имеет смысла относительно того, к чему он должен относиться.
@ Koder101 нет, я не это ищу
У него есть весь исходный код, двоичные файлы и образец приложения (хотя я не смотрел на него, так что вы, возможно, правы). Похоже на довольно простую библиотеку, которую вы можете установить через nuget.
@JNevill Дело в том, что я загрузил библиотеку consolecontrol, как он сказал, а затем, чтобы убедиться, что она работает, скопировал и вставил весь его код в новый проект, но я получал около 40+ ошибок. Если я чего-то не понимаю в формате, я бы просто сказал, что он не работает.





Я считаю, что лучший способ сделать это - перенаправить вывод. В основном все будет по-прежнему выполняться так, как вы хотите, но вы получите результат там, где хотите / нужно.
using System;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
namespace ConsoleOutput_test
{
public partial class Form1 : Form
{
Process sortProcess;
private static StringBuilder sortOutput = null;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
sortProcess = new Process();
sortProcess.StartInfo.FileName = "C:\\Windows\\System32\\cmd.exe";
// Set UseShellExecute to false for redirection.
sortProcess.StartInfo.CreateNoWindow = true;
sortProcess.StartInfo.UseShellExecute = false;
// Redirect the standard output of the sort command.
// This stream is read asynchronously using an event handler.
sortProcess.StartInfo.RedirectStandardOutput = true;
sortProcess.StartInfo.RedirectStandardInput = true;
sortProcess.StartInfo.RedirectStandardError = true;
sortOutput = new StringBuilder("");
// Set our event handler to asynchronously read the sort output.
sortProcess.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
sortProcess.ErrorDataReceived += new DataReceivedEventHandler(SortErrorHandler);
// Redirect standard input as well. This stream
// is used synchronously.
sortProcess.StartInfo.RedirectStandardInput = true;
// Start the process.
sortProcess.Start();
// Start the asynchronous read of the sort output stream.
sortProcess.BeginOutputReadLine();
while (!sortProcess.HasExited)
{
Application.DoEvents(); // This keeps your form responsive by processing events
}
}
private void SortOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
if (txtConsole.InvokeRequired) { txtConsole.BeginInvoke(new DataReceivedEventHandler(SortOutputHandler), new[] { sendingProcess, outLine }); }
else
{
txtConsole.AppendText(Environment.NewLine + outLine.Data);
}
}
private void SortErrorHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
if (txtConsole.InvokeRequired) { txtConsole.BeginInvoke(new DataReceivedEventHandler(SortErrorHandler), new[] { sendingProcess, outLine }); }
else
{
txtConsole.AppendText(Environment.NewLine + outLine.Data);
}
}
private void button2_Click(object sender, EventArgs e)
{
sortProcess.StandardInput.WriteLine(txtOutput.Text);
txtOutput.Text = "";
}
}
}