Pisanie i czytanie z 'obcej' konsoli

0

Mam pewien malutki problem. Piszę aplikację, która ma coś odczytać albo napisać w konsoli innego programu. Na początku uruchomiłem sobie pierwszy lepszy program w konsoli i próbowałem tylko odczytać. Co prawda odczytywało, ale TYLKO gdy zamykało się konsolę. Na prawdę nie wiem na czym polegał mój błąd stworzyłem nowy wątek, w nim pętlę, która po kolei sobie czyta konsolę:

private void StartProcess(string path)
        {
            using (process = new Process())
            {
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardInput = true;

                Thread OutReader = new Thread(ReadStdOut);

                process.Start();
                OutReader.Start();

                process.WaitForExit();
            }
        }

public void ReadOut()
        {
            try
            {
                string ReadedLine;
                while ((!process.HasExited) && ((ReadedLine = process.StandardOutput.ReadLine()) != null))
                    System.Windows.Forms.MessageBox.Show(ReadedLine);
            }
            catch (InvalidOperationException)
            {
                System.Windows.Forms.MessageBox.Show("Output hasn't been redirected or process has exited.");
            }
        }

No i nie wyskakiwały żadne okienka, tylko, jak mówiłem, po zamknięciu pojawiały się OBA komunikaty, na prawdę nie mam pojęcia co jest nie tak. Później, zdesperowany, po prostu zrobiłem timer i tam kod podobny jak wcześniej, tylko zamiast while if. Ale dalej wyskakiwały jakieś błędy. Teraz chciałem sprawdzić czy będzie działać na konsoli, którą sam napiszę. Więc dałem po prostu:

Console.Write("Czesc, dziala?\n");
                Console.ReadKey();

Ale gdy uruchamiałem ten proces poprzez mój program wywalało taki błąd, na którym ja zawsze klikam "Nie wysyłaj" :-D . Potem doszedłem, że to przez process.StartInfo.RedirectStandardInput = true;. Gdy się to usuwało wszystko było ok, ale nie czytało, ponieważ czytanie nie działa bez tego. :-[ Następnym krokiem było dodanie do tej mojej konsoli tego:

System.Diagnostics.Process.GetCurrentProcess().StartInfo.RedirectStandardInput = true;
                System.Diagnostics.Process.GetCurrentProcess().StartInfo.RedirectStandardOutput = true;

i bloku try, żeby sprawdzić, czy złapię wyjątek, który psuje konsolę, gdy uruchamiam ją przez mój program (pogmatwane, nie? :-P ). Ale dalej to samo (nawet żadnego komunikatu z catch?). Możliwe też, że takie przypisanie RedirectStandartOutput po starcie procesu jest niemożliwe, ale tego nie wiem. Potem jeszcze spróbowałem coś napisać w konsoli, lecz z podobnym skutkiem. Mam nadzieję, że sprawę opisałem jasno :-D . Proszę, jeżeli ktoś miał podobny problem i/lub poradził sobie z tym, niech mi pomoże.

Z góry dzięki, Wronq.

0

Rozważałeś zdarzenie OutputDataReceived i metodę BeginOutputReadLine z klasy Process?

0

Ok, wielkie dzięki. Ale teraz pytanie (wcześniej nie brałem tego pod uwagę, myślałem, że to wina tych błędów), czy jest możliwe, że ja nie 'zabiorę' tego co konsola chce napisać i to będzie tam dalej napisane. Ja będę to miał w swoim programie, a konsola dalej będzie to pokazywać. To co ja 'piszę' w konsoli też chyba nie jest w niej wyświetlanie, więc jaki to ma sens?
PS: te błędy były chyba tym spowodowane przez Console.ReadKey(). A nie było widać wiadomości z catch, bo od razu się wyłączał. Teraz dopiero napisało, że program nie posiada konsoli, czy coś takiego :-P

EDIT: Ale jeżeli konsola czeka na jakiś znak, to mi wypisuje całą zawartość dopiero po wciśnięciu tego znaku, wcześniej nie chce (tylko czasami? Może zależy od metody czekania na znak). Jak dodam w tym wydarzeniu msgBox'a, który ma wypisywać po kolei linie, to będą się pojawiały wszystkie po kolei [???] . Tak jakby mój program dopiero dostał wiadomość o tym, że coś wypisało się w konsoli np. 5 min temu... Jaka jest na to rada?

1 użytkowników online, w tym zalogowanych: 0, gości: 1