Как отправить ввод на консоль так, как будто пользователь печатает? - PullRequest
7 голосов
/ 16 января 2009

Это моя проблема. У меня есть программа, которая должна работать в TTY, Cygwin предоставляет этот TTY. Когда я перенаправляю stdIn, программа перестает работать, потому что у нее нет TTY. Я не могу изменить эту программу, и мне нужен какой-то способ ее автоматизации.

Как я могу получить окно cmd.exe, отправить ему данные и заставить его думать, что пользователь его печатает?

Я использую C #, я думаю, что есть способ сделать это с java.awt.Robot, но я должен использовать C # по другим причинам.

Ответы [ 4 ]

5 голосов
/ 17 января 2009

Я разобрался, как отправить ввод на консоль. Я использовал то, что сказал Джон Скит. Я не уверен на 100%, что это правильный способ реализовать это.

Если есть какие-либо комментарии, чтобы сделать это лучше, я бы с удовольствием. Я сделал это только для того, чтобы понять, смогу ли я понять это.

Вот программа, которую я смотрел, которая ждала ввода от пользователя

class Program
{
    static void Main(string[] args)
    {
        // This is needed to wait for the other process to wire up.
        System.Threading.Thread.Sleep(2000);

        Console.WriteLine("Enter Pharse: ");

        string pharse = Console.ReadLine();

        Console.WriteLine("The password is '{0}'", pharse);


        Console.WriteLine("Press any key to exit. . .");
        string lastLine = Console.ReadLine();

        Console.WriteLine("Last Line is: '{0}'", lastLine);
    }
}

Это консольное приложение, пишущее другому

class Program
{
    static void Main(string[] args)
    {
        // Find the path of the Console to start
        string readFilePath = System.IO.Path.GetFullPath(@"..\..\..\ReadingConsole\bin\Debug\ReadingConsole.exe");

        ProcessStartInfo startInfo = new ProcessStartInfo(readFilePath);

        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardInput = true;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.CreateNoWindow = true;
        startInfo.UseShellExecute = false;

        Process readProcess = new Process();
        readProcess.StartInfo = startInfo;

        // This is the key to send data to the server that I found
        readProcess.OutputDataReceived += new DataReceivedEventHandler(readProcess_OutputDataReceived);

        // Start the process
        readProcess.Start();

        readProcess.BeginOutputReadLine();

        // Wait for other process to spin up
        System.Threading.Thread.Sleep(5000);

        // Send Hello World
        readProcess.StandardInput.WriteLine("Hello World");

        readProcess.StandardInput.WriteLine("Exit");

        readProcess.WaitForExit();
    }

    static void readProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        // Write what was sent in the event
        Console.WriteLine("Data Recieved at {1}: {0}", e.Data, DateTime.UtcNow.Ticks);
    }
}
1 голос
/ 16 января 2009

Это звучит как задание для SendKeys(). Это не C #, а VBScript, но тем не менее - вы попросили какой-то способ его автоматизации:

Set Shell = CreateObject("WScript.Shell")

Shell.Run "cmd.exe /k title RemoteControlShell"
WScript.Sleep 250

Shell.AppActivate "RemoteControlShell"
WScript.Sleep 250

Shell.SendKeys "dir{ENTER}"
1 голос
/ 16 января 2009

Можете ли вы запустить программу (или cygwin) в своем коде, используя ProcessStartInfo.RedirectStandardInput (и вывод / ошибка) для управления потоком данных?

0 голосов
/ 16 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...