2014-09-10 15 views
7

Tak więc program, nad którym pracuję, można uruchomić za pomocą wiersza poleceń w CMD, używając następującego kodu.Jak wyświetlić echo istniejącego okna CMD?

string[] commandLines = Environment.GetCommandLineArgs(); 

Jednak chcę mieć możliwość zwrócenia wiadomości do okna CMD, z którego pochodzą linie poleceń po ich użyciu. Każda pomoc będzie doceniona.

Edytuj: Używam programu jako aplikacji systemu Windows, a nie aplikacji konsoli.

+0

Czy istnieje powód, dla którego pisanie do 'stdout' nie jest wystarczające? – IllusiveBrian

+2

@Namfuak Pytanie jest związane z C#. – ntl

+0

@ntl OK, mam na myśli to, że odpowiedź Jeffrey'a Wieder'a wydaje się zbyt prosta, biorąc pod uwagę, że pytanie otrzymuje tak wiele przebojów, więc być może jest pewne komplikacje, które uniemożliwiają OP korzystanie z niego. Przepraszam za kiepską terminologię. – IllusiveBrian

Odpowiedz

4

skończyło się rozwiązać problem za pomocą jednej z odpowiedzi RenniePet zamieszczonych w komentarzu do mojego pytania. Wymienię tutaj rozwiązanie dla każdego, kto spróbuje je odtworzyć.

[System.Runtime.InteropServices.DllImport("kernel32.dll")] 
private static extern bool AttachConsole(int dwProcessId); 

private const int ATTACH_PARENT_PROCESS = -1; 

StreamWriter _stdOutWriter; 

// this must be called early in the program 
public void GUIConsoleWriter() 
{ 
    // this needs to happen before attachconsole. 
    // If the output is not redirected we still get a valid stream but it doesn't appear to write anywhere 
    // I guess it probably does write somewhere, but nowhere I can find out about 
    var stdout = Console.OpenStandardOutput(); 
    _stdOutWriter = new StreamWriter(stdout); 
    _stdOutWriter.AutoFlush = true; 

    AttachConsole(ATTACH_PARENT_PROCESS); 
} 

public void WriteLine(string line) 
{ 
    GUIConsoleWriter(); 
    _stdOutWriter.WriteLine(line); 
    Console.WriteLine(line); 
} 

Po dodaniu tego kodu do programu można po prostu rozpocząć zwracanie wierszy za pomocą, na przykład, następujących elementów.

WriteLine("\nExecuting commands."); 
0

Chcesz użyć klasy Console do połączenia z nią, jeśli działa aplikacja konsoli.

Console.WriteLine("Text"); 

Jeśli korzystasz z aplikacji do obsługi okien, przeczytaj here.

+0

Używam aplikacji do obsługi okien, ale odpowiedź na pytanie, które połączyłeś, sprawia, że ​​mogę wyświetlić nowe okno z moją żądaną wiadomością. . Nie pozwala mi wyświetlić go w istniejącym oknie CMD. – WittyAdrian

1

Możesz użyć klasy .NET SendKeys, aby wysłać naciśnięcia klawiszy do aplikacji, która nie jest Twoją własnością. Aplikacja docelowa musi być aktywna, aby móc odzyskać naciśnięcia klawiszy. Dlatego przed wysłaniem musisz aktywować docelową aplikację. Robisz to, chwytając za uchwyt okna i przypinając je do SetForegroundWindow.

Oto przykładowy kod, aby dostać się zaczęło:

[DllImport("user32.dll", EntryPoint = "FindWindow")] 
    private static extern IntPtr FindWindow(string lp1, string lp2); 

    [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool SetForegroundWindow(IntPtr hWnd); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     IntPtr handle = FindWindow("ConsoleWindowClass", "Eingabeaufforderung"); 
     if (!handle.Equals(IntPtr.Zero)) 
     { 
      if (SetForegroundWindow(handle)) 
      { 
       // send 
       SendKeys.Send("Greetings from Postlagerkarte!"); 
       // send key "Enter" 
       SendKeys.Send("{ENTER}"); 
      } 
     } 
    } 
+0

Dzięki za odpowiedź. To faktycznie działa, jednak wyświetla wszystko, co robisz, jako dodatkowe linie. Więc jeśli chcesz wyświetlić komunikat, który będzie "echo blabla", co spowoduje dwie linie. Technicznie to działa, ale wolę szukać czegoś bardziej czystego. – WittyAdrian

+0

Nie rozumiem, co masz na myśli. SendKeys nie wysyła powrotu karetki. Dopóki nie wyślesz komendy {enter}, wszystko zostanie umieszczone w jednym wierszu. – Postlagerkarte

+0

Ale w pewnym momencie będę musiał nacisnąć enter, w którym to momencie przedstawi mi błąd, ponieważ "Pozdrowienia z Postlagerkarte!" nie jest prawidłowym poleceniem. Jako przykład. W efekcie skorzystałem z innego rozwiązania, które zamieściłem poniżej. – WittyAdrian

Powiązane problemy