Консоль в форме Visual C#

Я хочу получить консольное окно в моей форме. Обычно, когда вы нажимаете button1, запускается пакетный сценарий (test.exe). Мне не нужно отдельное окно пакета, но я хочу, чтобы оно отображалось в моей форме.

Я полагаю, что есть, вероятно, два способа сделать это: либо 1, каким-то образом встроить консоль в мою форму, либо 2, установить StartInfo.CreateNoWindow = true;, когда вы щелкнете button1 и получите вывод в воронку в список для имитации консоли в моей форме.

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

Какой метод будет проще и как мне это сделать?

что-то вроде этого?
JNevill 23.11.2018 18:08
или что-то в этом роде?
Koder101 23.11.2018 18:36

@JNevill Да, но я не могу заставить его работать даже с совершенно новым проектом. Если я чего-то не понимаю, половина установочного кода, который дает парень, - это просто переменные, которые либо нигде не определены, либо код, который не имеет смысла относительно того, к чему он должен относиться.

Matt Lynch 23.11.2018 20:39

@ Koder101 нет, я не это ищу

Matt Lynch 23.11.2018 20:40

У него есть весь исходный код, двоичные файлы и образец приложения (хотя я не смотрел на него, так что вы, возможно, правы). Похоже на довольно простую библиотеку, которую вы можете установить через nuget.

JNevill 23.11.2018 20:44

@JNevill Дело в том, что я загрузил библиотеку consolecontrol, как он сказал, а затем, чтобы убедиться, что она работает, скопировал и вставил весь его код в новый проект, но я получал около 40+ ошибок. Если я чего-то не понимаю в формате, я бы просто сказал, что он не работает.

Matt Lynch 23.11.2018 22:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
97
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ответ принят как подходящий
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 = "";
    }
}
}

Другие вопросы по теме