2011-10-12 4 views
3

特定の引数が渡された場合、コンソールアプリケーションとして使用できるWinFormプロジェクトがあります。私がここから読んだいくつかのヒントを使用して、私はこの作業を行うために次のコードを使用しました。WinForm/Consoleハイブリッドアプリケーションの動作

[System.Runtime.InteropServices.DllImport("kernel32.dll")] 
private static extern bool AllocConsole(); 

[System.Runtime.InteropServices.DllImport("kernel32.dll")] 
private static extern bool AttachConsole(int pid); 

... 

if (!AttachConsole(-1)) 
{ 
    AllocConsole(); 
} 

これは動作しますが、1件の迷惑な副作用があります - すべての出力は、バックグラウンドスレッドから生成されているように見えます。コマンドプロンプトからプログラムを実行すると、出力が表示される前に次のプロンプトが表示されます。

プロジェクトプロパティの出力タイプをコンソールアプリケーションに設定してこの問題を修正しましたが、今度は 'WinFormモード'で実行されていても常にコンソールウィンドウが表示されます。

プログラムがWinFormを表示しているときにコンソールが現在のプロセスであり、コンソールウィンドウが表示されないようにコンソールが動作する両方の環境を最大限に活用する方法はありますか?

更新日: 私はこのことを明確にしないことをお詫び申し上げます。私はこのようなProgram.csの中でコンソールとのWinFormモードを切り替えるいます:

// nowin is a bool that is set based on a parameter 
if (nowin) 
{ 
    if (!AttachConsole(-1)) 
    { 
     AllocConsole(); 
    } 
    //... Console mode code here... 
} 
else 
{ 
    // run in window 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1(argDict)); 
} 
+0

あなたが発見したことは、現在WinFormアプリケーションが動作する「副作用」ではありません。あなたが別々のプログラムを持っていれば、それはかなり楽になります。これが可能なようにアプリケーションを設計してください。 –

+1

[cmdから実行しているときのコンソールとwinformsアプリケーションの違い](http://stackoverflow.com/questions/7613880/difference-between-console-and-winforms-applications-when-running-from-cmd) –

答えて

1

周囲に道がないように見える: 1)コンソールモードの出力を専用のコンソールアプリケーションのように動作させたい場合、コンソールウィンドウは常にそこになければなりません。 2)ウィンドウモードでコンソールを実行しているときにコンソールを非表示にしたい場合は、ブロック印刷を失います。

6

は、たぶん私は間違ったことをやってきたが、私はいつもこのようなハイブリッドやった:これに代え

[STAThread] 
public static int Main(string[] args) 
{ 
    if (args.Length > 0) 
    { 
     // run console code here 
    } 
    else 
    { 
     // start up the win form app 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
    } 

    return 0; 
} 
2

をiffyメソッドを使用すると、winformsアプリケーションを作成し、コマンドラインで特定の引数が渡された場合にメインフォームを表示しないことで、これを達成できます。

コンソールアプリケーションはメッセージループを必要としないため、コンソールモードで呼び出されたときにApplication.Run()を呼び出さないでください。私はこれを試していないが、私はそれが仕事だと思う

static void Main(params string[] args) 
    { 
     if (args.Length > 0 && args[0] == "consolemode") 
     { 
      // do stuff 
     } 
     else 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new MainForm()); 
     } 
    } 

だからあなたのメインは、()のようなものになるだろう。