2014-09-10 15 views
7

Quindi il programma su cui sto lavorando può essere avviato utilizzando le righe di comando in CMD utilizzando il seguente codice.Come echo in una finestra CMD esistente

string[] commandLines = Environment.GetCommandLineArgs(); 

Tuttavia voglio essere in grado di restituire un messaggio alla finestra CMD in cui le linee di comando venuto da dopo di loro manipolazione. Qualsiasi aiuto sarebbe apprezzato.

Modifica: eseguo il programma come applicazione Windows, non come applicazione console.

+0

C'è un motivo per scrivere su 'stdout' non è sufficiente? – IllusiveBrian

+2

@Namfuak La domanda è correlata a C#. – ntl

+0

@ntl OK, intendo che la risposta di Jeffrey Wieder sembra troppo semplice considerando che la domanda sta ricevendo così tanti voti, quindi forse c'è qualche complicazione che impedisce all'OP di usarlo. Scusa per la scarsa terminologia. – IllusiveBrian

risposta

4

ho finito per risolvere il problema utilizzando una delle risposte RenniePet postato come commento alla mia domanda. Elencherò qui la soluzione per chiunque cerchi di riprodurlo.

[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); 
} 

Dopo aver aggiunto il codice al programma si può semplicemente avviare linee di ritorno utilizzando, per esempio, il seguente.

WriteLine("\nExecuting commands."); 
0

Si desidera utilizzare la classe Console per interfacciarsi con esso se si esegue un'applicazione console.

Console.WriteLine("Text"); 

Se si esegue un'applicazione Windows Form leggere here.

+0

Sto eseguendo un'applicazione Windows Form, ma la risposta alla domanda che hai collegato mi consente solo di mostrare una nuova finestra con il messaggio desiderato in esso . Non permettendomi di visualizzarlo nella finestra CMD esistente. – WittyAdrian

1

È possibile utilizzare la classe .NET SendKeys per inviare sequenze di tasti a un'applicazione che non si possiede. L'applicazione di destinazione deve essere attiva per poter recuperare le sequenze di tasti. Pertanto prima di inviare devi attivare la tua applicazione di destinazione. Lo fai ottenendo un handle della finestra e inserendo Pinvoking in SetForegroundWindow con il tuo handle.

Ecco qualche esempio di codice per iniziare:

[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

Grazie per la risposta. In realtà funziona, tuttavia visualizza tutto ciò che stai facendo come linee extra. Quindi, se vuoi mostrare un messaggio che sarebbe "echo blabla" che risulterebbe in due righe. Quindi tecnicamente funziona, ma preferisco cercare qualcosa di più pulito. – WittyAdrian

+0

Non capisco cosa intendi. SendKeys non invia un ritorno a capo. Quindi, se non si invia il comando {invio}, tutto viene messo su una riga. – Postlagerkarte

+0

Ma a un certo punto dovrò premere Invio, a quel punto mi verrà presentato un errore perché "Saluti da Postlagerkarte!" non è un comando valido. Solo come esempio. Ho finito per utilizzare un'altra soluzione che ho pubblicato di seguito. – WittyAdrian

Problemi correlati