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()をコールしていますが、コンソールへの出力が大量にある場合は、メソッドの呼び出しをフォームのコンストラクタとデストラクタに移した方がパフォーマンスは良いです。
関連記事
[…] sole.WriteLineを使っているけど、コマンドプロンプトからも確認できたら良いなと思って、違う方法で実装してみた。 FlashDevelopで開発中は問題なかったものの、なぜかAIRアプリケーション […]