プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2018/05/10

Windows デスクトップアプリでコンソールに出力する

event_note2018/05/10 5:07

コンソールアプリケーションであれば何も考えなくてもコンソールに出力できますが、Windows デスクトップアプリケーションの場合はコンソールを作成する必要があります。

環境

  • Visual Studio 2017
  • .NET Framework 4.6.2

コマンドプロンプトからアプリケーションを起動した場合

この場合は親のコンソールにアタッチします。
以下の記事を参考にしてください。

GUI からアプリケーションを起動した場合

exe ファイルをダブルクリックするなどしてアプリケーションを起動した場合は親のコンソールがないため、コンソールを作成する必要があります。

以下コード例です。

[System.Runtime.InteropServices.DllImport("Kernel32.dll")]
static extern bool AttachConsole(int processId);
const int ATTACH_PARENT_PROCESS = -1;

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

[System.Runtime.InteropServices.DllImport("Kernel32.dll")]
static extern bool FreeConsole();

[STAThread]
public static void Main(string[] args)
{
    var attachConsole = AttachConsole(ATTACH_PARENT_PROCESS);

    if (attachConsole == false)
    {
        // 親のコンソールがないので作成する
        if (AllocConsole() == false)
        {
            return;
        }

        // 標準出力のストリームを取得
        var stream = Console.OpenStandardOutput();
        var stdout = new StreamWriter(stream)
        {
            // Write メソッド実行時に即出力するためには AutoFlush プロパティを True にする必要があるらしい
            AutoFlush = true,
        };
        // 出力先を標準出力に設定
        Console.SetOut(stdout);
    }                

    Console.WriteLine("Hello World.");

    if (attachConsole == false)
    {
        // コンソールの解放
        FreeConsole();
    }
}

参考 URL