2011-08-14 15 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 

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 

d:\Dokumenty\Dev\C#\Projekty\Win32\Sketchbook\wfSketchbook\bin\Debug>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()を使用することです:一つの回避策は待つようにそれを伝えることです。どの副作用が第2コンソールウィンドウを作成するか。アプリケーションの種類をコンソールに変更してからFreeConsole()を呼び出すことは理想的ではありません。ウィンドウのフラッシュはかなり目立ちます。あなたの毒を選ぶ。