[C#] WinFormのプログラムからコンソール(標準出力)に文字を出力する

Windowsでは通常GUI(WinForm)のプログラムを作成した場合、通常ではコンソールへの文字出力を行う事ができません。コンソールアプリケーションでの文字列出力メソッドのSystem.Console.WriteLine()を試しに呼び出してみても、残念ながら何も出力されません。


ですが、プログラムのデバッグなど、コンソールに文字出力ができると便利なな場合も有ります。
このような場合、Win32 APIをコールする事で出力が可能です。

using System;
using System.Windows.Forms;
 
using System.Runtime.InteropServices; //DllImport属性を使用するために必要
 
namespace WinFormTest1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
 
            // コンソールにログを出力
            writeConsole( "Form1() called" );
        }
 
        private void Form1_Load( object sender, EventArgs e ) {
            // コンソールにログを出力
            writeConsole( "Form1_Load called" );
        }
 
 
        [DllImport("kernel32.dll")]
        public static extern bool AttachConsole(uint dwProcessId);
 
        [DllImport("kernel32.dll")]
        public static extern bool FreeConsole();
 
        //*********************************************************************
        /// <summary> コンソールに文字を出力する
        /// 
        /// </summary>
        /// <param name="msg">  出力する文字列</param>
        /// <returns>           true:成功, false:失敗</returns>
        //*********************************************************************
        private bool writeConsole( string msg ) {
 
            if ( !AttachConsole( System.UInt32.MaxValue ) ) {
                return false;
            }
 
            // stdoutのストリームを取得
            System.IO.Stream       stream = System.Console.OpenStandardOutput();
            System.IO.StreamWriter stdout = new System.IO.StreamWriter( stream );
 
            // 指定された文字列を出力
            stdout.WriteLine( msg );
            stdout.Flush();
 
            FreeConsole();
            return true;
        }
    }
}



上記例では、Win32APIのAttachConsole()、FreeConsole()を利用しています。
両APIは Windows2000以前のOSでは使用不可なので注意が必要です。(XP以降で追加されたAPIなので)


AttachConsoleの引数にMaxValueを指定する事で,自分のexeが実行されたコンソールが取得できます。

[Parameters]
dwProcessId [in]
 
ATTACH_PARENT_PROCESS (DWORD)-1
Use the console of the parent of the current process.


MSDNのAttachConsole function より


このプログラムを実行すると、以下のようにコンソールへの文字列出力が行えました。



またサンプルでは、writeConsole()メソッド内でAttachConsole()、FreeConsole()をコールしていますが、コンソールへの出力が大量にある場合は、メソッドの呼び出しをフォームのコンストラクタとデストラクタに移した方がパフォーマンスは良いです。

関連記事

コメントを残す

メールアドレスが公開されることはありません。