WPF+调用控制台输出信息
2019-04-14 本文已影响0人
Memoyu
WPF + 控制台输出信息
需求:
有时候我们需要在WPF项目调试的时候使用 console输出log ,输出错误信息,调试信息等,而不需要在编译器中查看输出 。此时需要实现 打开程序时,出现两个窗口,一个是控制台,一个是主程序。
问题:
网上看了一些教程,然后控制台窗口弹出却无法显示输出信息。猜测是编译器版本的问题。
解决方法:
右键项目 - 属性 - 修改输出类型 - 控制台应用程序 修改输出类型.jpg
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WindowsAPI_显示控制台Console
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
[DllImport("Kernel32.dll")]
public static extern Boolean AllocConsole();
[DllImport("Kernel32.dll")]
public static extern Boolean FreeConsole();
public MainWindow()
{
AllocConsole();
InitializeComponent();
BtnCloseConsole.Click += BtnCloseConsole_Click;
#if DEBUG
Shell.WriteLine("\t程序启动");
Shell.WriteLine("{0}:{1}" , "警告" , "这是警告信息");
Shell.WriteLine("{0}:{1}" , "错误" , "这是错误信息");
Shell.WriteLine("{0}:{1}", "注意", "这是注意信息");
#endif
}
/// <summary>
/// 关闭按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnCloseConsole_Click(object sender, RoutedEventArgs e)
{
Shell.WriteLine("{0}:{1}", "注意", "两秒后关闭窗口");
Thread.Sleep(1000);
Shell.WriteLine("{0}:{1}", "注意", "一秒后关闭窗口");
Thread.Sleep(1000);
Shell.WriteLine("{0}:{1}", "注意", "正在关闭窗口");
Thread.Sleep(500);
FreeConsole();//关闭控制台
}
}
/// <summary>
/// 自定义输出类
/// </summary>
static class Shell
{
/// <summary>
/// 输出调用方法
/// </summary>
/// <param name="format">格式</param>
/// <param name="args">需要拼接的参数</param>
public static void WriteLine( string format , params object[] args)
{
WriteLine(string.Format(format, args));//将指定字符串中的格式项替换为指定数组中相应对象的字符串表示形式。
}
/// <summary>
/// 输出方法
/// </summary>
/// <param name="output">输出的文本</param>
public static void WriteLine( string output)
{
Console.ForegroundColor = GetConsoleColor(output);//设置颜色
Console.WriteLine(@"[{0:G}]{1}" ,DateTimeOffset.Now,output);//输出到控制台
}
/// <summary>
/// 根据类型区分输出颜色
/// </summary>
/// <param name="output">需要输出的字符串</param>
/// <returns></returns>
static ConsoleColor GetConsoleColor(string output)
{
if (output.StartsWith("警告")) return ConsoleColor.Yellow;//根据前缀返回颜色
if (output.StartsWith("错误")) return ConsoleColor.Red;
if (output.StartsWith("注意")) return ConsoleColor.Green;
return ConsoleColor.Gray;
}
}
}