Перенаправить консольный ввод и вывод в текстовое поле - PullRequest
2 голосов
/ 21 мая 2010

Привет и спасибо заранее

Я пытаюсь (очень тяжело) перенаправить ввод и вывод с консоли в текстовое поле. Пока что выход работает нормально, но проблема с вводом. Например, я не могу выполнить простую программу, которая будет делать следующее:

Console.WriteLine («Пожалуйста, введите ваше имя:»); string name = Console.ReadLine (); Console.WriteLine ("Привет!" + Имя);

Причина, по которой я не могу этого сделать, заключается в том, что программа должна остановиться, ожидая, пока пользователь введет свое имя и нажмет ввод. Если я жду ввода пользователя в новом потоке, основной поток GUI замирает и текстовое поле никогда не может получить KeyPress. Эта вещь меня совершенно запутала. Любой совет (или еще лучше код) будет принята с благодарностью.

Приветствия

1 Ответ

0 голосов
/ 13 сентября 2011

Приведенный ниже код представляет собой консольное приложение, которое вызывает другое консольное приложение для выполнения какой-либо работы, а не приложение WinForm, но вы можете легко заменить обработчики событий (TransformProcessOutputDataReceived и TransformProcessErrorDataReceived) для вывода в текстовое поле вместо TextWriter. К сожалению, это не решает проблему вызываемого консольного приложения, ожидающего ввода данных пользователем. Приведенный ниже код перекачивает некоторый ввод в вызываемое консольное приложение через стандартный ввод, поэтому, возможно, вы могли бы передать его из своего приложения windows таким же образом.

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

private static void ProcessRetrievedFiles(List<string> retrievedFiles)
    {
        Console.WriteLine();
        Console.WriteLine("Processing retrieved files:");
        Console.WriteLine("---------------------------");
        Console.WriteLine();
        foreach (string filePath in retrievedFiles)
        {
            if (String.IsNullOrEmpty(filePath)) continue;

            Console.WriteLine(filePath);
            Process transformProcess = new Process();

            string baseOutputFilePath = Path.Combine(ExportDirectory, Path.GetFileNameWithoutExtension(filePath));

            transformProcess.StartInfo.FileName = TransformerExecutablePath;
            transformProcess.StartInfo.Arguments = string.Format(
                "-i:\"{0}\" -x:\"{1}\" -o:\"{2}.final.xml\"",
                filePath,
                string.Empty,
                baseOutputFilePath);
            transformProcess.StartInfo.UseShellExecute = false;
            transformProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            transformProcess.StartInfo.RedirectStandardError = true;
            transformProcess.StartInfo.RedirectStandardOutput = true;
            transformProcess.StartInfo.RedirectStandardInput = true;

            transformProcess.EnableRaisingEvents = true;

            //attach the error/output recievers for logging purposes
            transformProcess.ErrorDataReceived += TransformProcessErrorDataReceived;
            transformProcess.OutputDataReceived += TransformProcessOutputDataReceived;

            ProcessBridgeFileOutputWriter = new StreamWriter(
                    baseOutputFilePath + ".log",
                    false);

            ProcessBridgeFileOutputWriter.AutoFlush = true;

            transformProcess.Start();

            transformProcess.BeginOutputReadLine();
            transformProcess.BeginErrorReadLine();

            //the exe asks the user to press a key when they are done...
            transformProcess.StandardInput.Write(Environment.NewLine);
            transformProcess.StandardInput.Flush();

            //because we are not doing this asynchronously due to output writer
            //complexities we don't want to deal with at this point, we need to 
            //wait for the process to complete
            transformProcess.WaitForExit();

            ProcessBridgeFileOutputWriter.Close();
            ProcessBridgeFileOutputWriter.Dispose();

            //detach the error/output recievers
            transformProcess.ErrorDataReceived -= TransformProcessErrorDataReceived;
            transformProcess.OutputDataReceived -= TransformProcessOutputDataReceived;
        }
    }

    static void TransformProcessOutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        if (!string.IsNullOrEmpty(e.Data))
        {
            ProcessBridgeFileOutputWriter.WriteLine(e.Data);
        }
    }

    static void TransformProcessErrorDataReceived(object sender, DataReceivedEventArgs e)
    {
        if (!string.IsNullOrEmpty(e.Data))
        {
            ProcessBridgeFileOutputWriter.WriteLine(string.Format("ERROR: {0}", e.Data));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...