2014-09-10 14 views
7

Şu an üzerinde çalıştığım program, aşağıdaki kod kullanılarak CMD'de komut satırları kullanılarak başlatılabilir.Varolan bir CMD penceresine nasıl eklenir

string[] commandLines = Environment.GetCommandLineArgs(); 

Ancak, komut satırlarının ele alındıktan sonra komut satırlarının geldiği CMD penceresine bir ileti gönderebilmek istiyorum. Herhangi bir yardım takdir edilecektir.

Düzenleme: Programı bir Windows uygulaması olarak çalıştırıyorum, bir konsol uygulaması değil.

+0

'Stdout' yazmanın bir nedeni yeterli değil mi? – IllusiveBrian

+2

@Namfuak Soru C# ile ilgilidir. – ntl

+0

@ntl Tamam, yani Jeffrey Wieder'in cevabı bu kadar çok upvotes almayı düşünürsek çok basit görünüyor, bu yüzden OP'in onu kullanmasını engelleyen bir takım komplikasyonlar var. Kötü terminoloji için özür dilerim. – IllusiveBrian

cevap

4

Ben cevaplar biri benim soruya bir yorum olarak yayınlanmıştır RenniePet kullanarak sorunu çözmeye sona: Burada

başlangıç ​​için bazı örnek kodudur. Çözümü yeniden oluşturmaya çalışan herkes için çözümü burada listeleyeceğim.

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

Programınıza bu kodu ekledikten sonra sadece aşağıdaki örneğin kullanarak çizgileri dönen başlayabilirsiniz.

WriteLine("\nExecuting commands."); 
0

Konsol uygulaması çalıştırıyorsa, Console sınıfını arabirimle kullanmak istiyorsunuz.

Console.WriteLine("Text"); 

Windows form uygulaması çalıştırıyorsanız, here okuyun.

+0

Ben bir windows form uygulaması çalıştırıyorum, ama bana bağladığınız sorunun cevabı sadece bana istediğim mesaj ile yeni bir pencere göstermek mümkün kılar . Mevcut CMD penceresinde görüntülememe izin vermiyor. – WittyAdrian

1

Sahip olduğunuz bir uygulamaya tuş vuruşlarını göndermek için .NET SendKeys sınıfını kullanabilirsiniz. Tuş vuruşlarını alabilmek için hedef uygulama aktif olmalıdır. Bu yüzden göndermeden önce hedef uygulamanızı aktif hale getirmelisiniz. Pencerenin bir tutamacını alarak ve SetForegroundWindow'u tutamacınız ile pinvoking yaparak yapabilirsiniz.

[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

Cevabınız için teşekkür ederiz. Bu aslında çalışır, ancak ekstra çizgiler olarak yaptığınız her şeyi gösterir. Yani, iki satıra neden olacak "echo blabla" olacak bir mesaj görüntülemek isterseniz. Teknik olarak bu işe yarıyor, ama daha temiz bir şey aramayı tercih ediyorum. – WittyAdrian

+0

Ne demek istediğini anlamadım. SendKeys bir satırbaşı göndermez. Yani, {enter} komutunu göndermediğiniz sürece her şey bir satıra yerleştirilir. – Postlagerkarte

+0

Ama bir noktada enter tuşuna basmam gerekecek, bu noktada bana bir hata sunacak çünkü "Postlagerkarte'den selamlar!" geçerli bir komut değil. Sadece bir örnek olarak. Aşağıda yayınladığım başka bir çözüm kullanarak sona erdi. – WittyAdrian

İlgili konular