如何为窗体应用程序显示控制台

                     如何为窗体应用程序显示控制台
                               周银辉


由于某种特殊需求(⊙﹏⊙),需要将窗体应用程序的控制台输出显示出来,其实是为了显示Console.Write()信息以便调试哈(VS的output窗口是可以显示的,但是,实际情况是,脱离了VS的, 远程调试?forget it!反正是脱离了啦) 

发现,其实win32 是提供了“为进程分配控制台”这样的方法的,这就是:

 

        /// <summary>
        
/// Allocates a new console for the calling process
        
/// </summary>
        
/// <returns>If the function succeeds, return true</returns>
        [DllImport("kernel32")]
        
static extern bool AllocConsole();

 调用该方法的进程的标准输入流和输出流都将默认地与这个方法创建的控制台关联起来,也就是说调用Console.xxx()方法都将是针对这个控制台了。

OK,简单地包装一下:

public class ConsoleWindow2
    {
        
public static IntPtr CreateConsole()
        {
            var console 
= new ConsoleWindow2();
            
return console.Hwnd;
        }

        
public IntPtr Hwnd { getprivate set; }

        
public ConsoleWindow2()
        {
            Initialize();
        }

        
public void Initialize()
        {
            Hwnd 
= GetConsoleWindow();

            
// Console app
            if (Hwnd != IntPtr.Zero)
            {
                
return;
            }

            
// Windows app
            AllocConsole();
            Hwnd 
= GetConsoleWindow();
        }

        
#region Win32

        [DllImport(
"kernel32")]
        
static extern IntPtr GetConsoleWindow();

        [DllImport(
"kernel32")]
        
static extern bool AllocConsole();


        
#endregion
    }

 

试验一下:

 

如果需要更多的控制,可以参考下面这些和控制台相关的API:

 

some APIs about console

还是简单地声明一下:
博文中的内容可能是一个小技巧,但绝非特定问题的解决方案,所以不要太在意其是否有意义或用途,或许对于不同的人不同的场景有着不同的意义或用途。
还是那句话:仅供参考 :)

posted @ 2009-06-06 12:08  周银辉  阅读(4307)  评论(12编辑  收藏  举报