2011-08-14 41 views
3

我正在嘗試編寫一個程序,它在控制檯或GUI模式下工作,具體取決於執行參數。我已經成功地寫出下面的示例代碼:如何在程序執行時擁有控制檯?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace wfSketchbook 
{ 
    static class Program 
    { 
     [DllImport("Kernel32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     private static extern bool AttachConsole(int processId); 

     [DllImport("Kernel32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     private static extern bool AllocConsole(); 

     [DllImport("Kernel32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     private static extern bool FreeConsole(); 

     private const int ATTACH_PARENT_PROCESS = -1; 

     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main(string[] args) 
     { 
      if (args.Length > 0) 
      { 
       if (!AttachConsole(ATTACH_PARENT_PROCESS)) 
        AllocConsole(); 
       Console.WriteLine("Welcome to console!"); 
       Console.ReadKey(); 
       FreeConsole(); 
      } 
      else 
      { 
       Application.EnableVisualStyles(); 
       Application.SetCompatibleTextRenderingDefault(false); 
       Application.Run(new Form1()); 
      } 
     } 
    } 
} 

它通常工作,但是當程序從系統的命令行調用,CMD似乎沒有意識到,這個程序工作在控制檯模式,並立即退出:

d:\Dokumenty\Dev\C#\Projekty\Win32\Sketchbook\wfSketchbook\bin\Debug>wfSketchbook.exe test 

d:\Dokumenty\Dev\C#\Projekty\Win32\Sketchbook\wfSketchbook\bin\Debug>Welcome to console! 

d:\Dokumenty\Dev\C#\Projekty\Win32\Sketchbook\wfSketchbook\bin\Debug> 

我寧願希望以下的輸出:

d:\Dokumenty\Dev\C#\Projekty\Win32\Sketchbook\wfSketchbook\bin\Debug>wfSketchbook.exe test 

Welcome to console! 

d:\Dokumenty\Dev\C#\Projekty\Win32\Sketchbook\wfSketchbook\bin\Debug> 

我怎麼可能會解決這個問題呢?

回答

1

沒有任何可靠的方法使Windows應用程序成爲控制檯和GUI。你的程序是一個Windows應用程序 - 所以Windows在控制檯窗口之外啓動你 - 當程序啓動時,你沒有連接到控制檯窗口。

您可以將項目輸出更改爲項目屬性中的控制檯應用程序。但是,你總會得到一個控制檯窗口。 Windows可能會看到您的應用程序被標記爲控制檯應用程序,甚至在您運行之前創建控制檯。

看到這個blog post欲瞭解更多信息和一些解決辦法的鏈接。

3

對此沒有理想的解決方案。 Cmd.exe只會自動等待程序完成,如果它可以看到.exe是一個控制檯模式的應用程序。這不適用於你的應用程序。一個解決辦法是告訴它等待:

啓動/等待yourapp.exe [參數]

另一種是始終使用AllocConsole()。它創建第二個控制檯窗口的副作用。將應用程序類型更改爲控制檯,然後調用FreeConsole()也不理想,該窗口的閃爍很明顯。選擇你的毒藥。

相關問題