C# WPF 使用Console.Write打印信息到控制台窗口中

来源:互联网 时间:1970-01-01


    WPF中使用Console.Write函数来打印信息是没有意义的,因为并没有给其输出字符的窗口。对于桌面程序来说,这是十分合理的,然而有时为了方便调试,在程序编写过程中打印出信息给程序员看还是必要的,所以本文参考了这篇文章,利用Windows的API,在DEBUG的时候打开一个控制台窗口以供信息打印显示。

    过程很简单,创建一个如下的类

    命名空间

using System.Runtime.InteropServices;using System.Diagnostics;using System.IO;
    类声明和实现

public static class ConsoleManager{ private const string Kernel32_DllName = "kernel32.dll"; [DllImport(Kernel32_DllName)] private static extern bool AllocConsole(); [DllImport(Kernel32_DllName)] private static extern bool FreeConsole(); [DllImport(Kernel32_DllName)] private static extern IntPtr GetConsoleWindow(); [DllImport(Kernel32_DllName)] private static extern int GetConsoleOutputCP(); public static bool HasConsole { get { return GetConsoleWindow() != IntPtr.Zero; } } /// Creates a new console instance if the process is not attached to a console already. public static void Show() { #if DEBUG if (!HasConsole) { AllocConsole(); InvalidateOutAndError(); } #endif } /// If the process has a console attached to it, it will be detached and no longer visible. Writing to the System.Console is still possible, but no output will be shown. public static void Hide() { #if DEBUG if (HasConsole) { SetOutAndErrorNull(); FreeConsole(); } #endif } public static void Toggle() { if (HasConsole) { Hide(); } else { Show(); } } static void InvalidateOutAndError() { Type type = typeof(System.Console); System.Reflection.FieldInfo _out = type.GetField("_out", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); System.Reflection.FieldInfo _error = type.GetField("_error", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); System.Reflection.MethodInfo _InitializeStdOutError = type.GetMethod("InitializeStdOutError", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); Debug.Assert(_out != null); Debug.Assert(_error != null); Debug.Assert(_InitializeStdOutError != null); _out.SetValue(null, null); _error.SetValue(null, null); _InitializeStdOutError.Invoke(null, new object[] { true }); } static void SetOutAndErrorNull() { Console.SetOut(TextWriter.Null); Console.SetError(TextWriter.Null); }}

    在需要之处打开控制台窗口
ConsoleManager.Show();//打开控制台窗口
    接着便可随意在窗口上打印信息了
Console.Write("abc/n");Console.Write("abc/n");








相关阅读:
Top