2016-09-21 60 views
0

只是一個簡要的說明,這個問題已被重新編輯爲更加簡潔。在Winforms項目上沒有控制檯輸出,在控制檯項目上工作

我正在使用.NET(無論是在C#或VB中,無所謂)。我有一個控制檯應用程序,一些基本的東西:

using System; 

namespace ConsolePrinter 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Output"); 
      Console.ReadLine(); 
     } 
    } 
} 

在我的WinForms應用程序,我需要重定向標準錯誤和標準輸入,而不是標準輸出。標準輸出應該繼續顯示在控制檯窗口中。通過製作一個簡單的Winforms項目並將上述控制檯EXE作爲一個Process對象啓動,我仍然可以在召喚的控制檯中查看控制檯的輸出。只要我重定向標準錯誤,輸出就會從控制檯窗口中消失,並且所有顯示的內容都是空白控制檯。

下面是一個例子WinForms項目:

using System; 
using System.Windows.Forms; 
using System.Diagnostics; 

namespace winformstest2 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Process proc = new Process(); 
      proc.StartInfo.FileName = "ConsolePrinter.exe"; 
      //proc.StartInfo.RedirectStandardError = true; 
      proc.StartInfo.UseShellExecute = false; 

      proc.Start(); 
     } 
    } 
} 

此代碼按預期工作。取消註釋該評論行提供了我正在談論的錯誤。

我已經嘗試過將表單附加到控制檯項目,但不幸的是我需要頻繁地顯示和隱藏控制檯,所以啓動控制檯應用程序作爲一個過程是理想的。使用Win32 API也是一種想法,但用戶不應該通過關閉控制檯來關閉整個應用程序,該控制檯會將AllocConsole()和其他Win32 API調用作爲其使用的雙重產品引起。

任何幫助表示讚賞,謝謝!

+1

目前還不清楚發生了什麼 - 當您啓動命令行應用程序時,是否會啓動*與控制檯窗口*?這肯定會有幫助,有一個[mcve](控制檯應用程序和一個小型的WinForms應用程序 - 它只需要一個帶按鈕的窗口來啓動控制檯應用程序...) –

+0

這是http:// stackoverflow .COM /問題/ 4362111 /怎麼辦 - 我秀 - 一個控制檯輸出窗口-IN-A-形式的應用程序。雖然你必須將代碼轉換爲vb.net – FloatingKiwi

+0

@JonSkeet這是一個輸出到stdout的C++程序,沒什麼特別的。在控制檯項目中,它直接輸出到.net控制檯窗口,Winforms會打開控制檯但不輸出任何內容。 – KingDan

回答

1

事實證明,我之所以有一個很難再現,這是,這是不是一個代碼問題都沒有 - 這是怎樣的代碼是正在運行。

如果您在調試器中運行該程序,出於某種原因將RedirectStandardError設置爲true會改變行爲,如上所述。在調試器外部 - 通過命令行或資源管理器啓動應用程序,或者通過「無需調試即可啓動」在Visual Studio中啓動 - 應用程序會根據需要顯示輸出。

解決這個問題最簡單的方法就是在需要輸出時無需調試即可存活。這可能很尷尬,但它可能比替代品更簡單。

另一種選擇是在WinForms應用程序中重定向所有內容並構建自己的迷你控制檯。這將是更整潔,更普遍的用戶友好 - 沒有額外的窗口彈出各地 - 但更多的工作。可能值得考慮的是,如果這將成爲許多人經常使用的長期應用程序,但不值得做其他事情。

0

Using this solution應該工作。請注意,這是一個Winforms應用程序。

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace ConsoleExRun 
{ 

    class Program 
    { 
     [DllImport("kernel32.dll", SetLastError = true)] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     static extern bool AllocConsole(); 

     static void Main(string[] args) 
     { 
      AllocConsole(); 

      Process proc = new Process(); 
      proc.StartInfo.UseShellExecute = false; 
      proc.StartInfo.FileName = "ping"; 
      proc.StartInfo.Arguments = "localhost"; 
      proc.StartInfo.RedirectStandardError = true; 
      proc.StartInfo.RedirectStandardInput = true; 

      proc.Start(); 

      Form f = new Form(); 
      Application.Run(f); 
     } 
    } 
} 
+0

沒有必要爲* this *進程分配一個控制檯。 –

+0

我會給你打個招呼,但我已經通過這個解決方案。關閉控制檯關閉整個程序,所以我可能只是做一個控制檯項目並附上表單。 – KingDan

+0

@JonSkeet - 從我的代碼中不清楚,但這是一個winforms應用程序。對AllocConsole的調用允許stdout顯示在控制檯窗口中。我修改了這個例子,使其更加明顯 – FloatingKiwi