本文转载:http://blog.csdn.net/oyi319/article/details/5753311

2.WinForm程序和控制台窗口Console

如果你调试过SharpDevelop的源程序,会发现它在DEBUG模式时会出现一个控制台窗口,以显示日志信息。或许我使用的方法与其不同,不过你可以试一试,写出我们自己的调试日志代码。

首先要解决的问题是如何在Debug模式时显示Console窗口。我确定,这是一个WinForm项目,也没有改过它的输出类型。我们需要在项目的入口点使用一些API函数将控制台显示出来:

它们是 AllocConsole 和 FreeConsole。

  1. [DllImport("kernel32.dll")]
  2. public static extern Boolean AllocConsole();
  3. [DllImport("kernel32.dll")]
  4. public static extern Boolean FreeConsole();

然后我们使它在Main()开始处判断DEBUG编译标记,调用AllocConsole方法显示控制台,然后在Main()的结束处判断DEBUG编译标记,调用FreeConsole方法关闭控制台。这样,我们就可以使用Console.Write等方法将调试信息显示在这个控制台窗口里。

为了达到更好的效果,我们写一个Shell类,用它来封装Console.WriteLine方法,输出个性化信息。我是这样做的,根据输出到控制台的文本的前几个字判断为“警告”、“错误”、“注意”时,输出带有黄色、红色、绿色的文字,其他输出信息输出控制台缺省的灰色文字,以起到区分效果,还要在每条信息前加上输出信息的当时时间。

这个Shell类是这样的:

  1. /// <summary>
  2. /// 与控制台交互
  3. /// </summary>
  4. static class Shell
  5. {
  6. /// <summary>
  7. /// 输出信息
  8. /// </summary>
  9. /// <param name="format"></param>
  10. /// <param name="args"></param>
  11. public static void WriteLine(string format, params object[] args)
  12. {
  13. WriteLine(string.Format(format, args));
  14. }
  15. /// <summary>
  16. /// 输出信息
  17. /// </summary>
  18. /// <param name="output"></param>
  19. public static void WriteLine(string output)
  20. {
  21. Console.ForegroundColor = GetConsoleColor(output);
  22. Console.WriteLine(@"[{0}]{1}", DateTimeOffset.Now, output);
  23. }
  24. /// <summary>
  25. /// 根据输出文本选择控制台文字颜色
  26. /// </summary>
  27. /// <param name="output"></param>
  28. /// <returns></returns>
  29. private static ConsoleColor GetConsoleColor(string output)
  30. {
  31. if (output.StartsWith("警告")) return ConsoleColor.Yellow;
  32. if (output.StartsWith("错误")) return ConsoleColor.Red;
  33. if (output.StartsWith("注意")) return ConsoleColor.Green;
  34. return ConsoleColor.Gray;
  35. }
  36. }

那么程序入口函数Main代码如下:

  1. /// <summary>
  2. /// 应用程序的主入口点。
  3. /// </summary>
  4. [STAThread]
  5. static void Main()
  6. {
  7. #if DEBUG
  8. AllocConsole();
  9. Shell.WriteLine("注意:启动程序...");
  10. Shell.WriteLine("/tWritten by Oyi319");
  11. Shell.WriteLine("/tBlog: http://blog.csdn.com/oyi319");
  12. Shell.WriteLine("{0}:{1}", "警告", "这是一条警告信息。");
  13. Shell.WriteLine("{0}:{1}", "错误", "这是一条错误信息!");
  14. Shell.WriteLine("{0}:{1}", "注意", "这是一条需要的注意信息。");
  15. Shell.WriteLine("");
  16. #endif
  17. Application.EnableVisualStyles();
  18. Application.SetCompatibleTextRenderingDefault(false);
  19. Application.Run(new Form1());
  20. #if DEBUG
  21. Shell.WriteLine("注意:2秒后关闭...");
  22. Thread.Sleep(2000);
  23. FreeConsole();
  24. #endif
  25. }

现在这个控制台窗口,只会在DEBUG模式时显示,而在Release编译时不会出现。 这是不是你想要的调试方法呢?

WinForm程序启动控制台窗口Console的更多相关文章

  1. C#WinForm程序显示控制台窗口Console

    启动一个WINFORM项目,使用一些API函数将控制台显示出来: AllocConsole 和 FreeConsole. 本程序只在DEBUG模式下显示控制台 [DllImport("ker ...

  2. 给Win32 GUI程序增加控制台窗口的方法

    给Win32 GUI程序增加控制台窗口的方法 2008年10月11日 星期六 下午 04:43 在Win32的GUI程序中,没有控制台窗口,我们输出调试信息时有些不方便,以往我的做法是使用Messag ...

  3. c# 控制台程序 隐藏控制台窗口

    在某些项目中,需要采用控制台程序,但是又不需要通过dos窗口进行交互,同时打算隐藏掉难看的控制台窗口.实现的方法很多,有的是修改链接命令.我采用的方法略有些麻烦,首先是给窗口命名,之后找到该窗口指针, ...

  4. Web应用程序或者WinForm程序 调用 控制台应用程序及参数传递

    有时候在项目中,会调用一个控制台应用程序去处理一些工作.那在我们的程序中要怎么样做才能调用一个控制台应用程序并将参数传递过去,控制台程序执行完后,我们的程序又怎样获取返回值?代码如下:调用代码:    ...

  5. WinForm 之 程序启动不显示主窗体

    在 WinForm 程序启动时,不显示主窗体的实现方法主要有以下5种,第五种最简单,而且效果也不错,第四种方法也值得推荐. 实例代码如下: //隐藏窗体的方法1/5:不指定任何窗体为主窗体 //注意: ...

  6. 微软 WCF的几种寄宿方式,寄宿IIS、寄宿winform、寄宿控制台、寄宿Windows服务

    WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便.高效提供服务调用.本文分别对这几种方式进行详 ...

  7. C#使用Process启动exe程序,不弹出控制台窗口的方法

    背景:使用wkhtmltopdf工具将html转换成pdf时,这个工具在进行转换时会弹出命令行窗口显示转换过程,但是在项目运行时弹出服务器突然弹出控制台窗口会很奇怪,尤其是当转换多个时.解决这个问题 ...

  8. 如何:在 Winform 动态启动、控制台命令行?

    需求   winForm 程序输出类型为 windows 程序(不是命令行程序)   在运行时想输入一些信息编译开发调试,如何实现这一功能 解答:  AllocConsole.FreeConsole ...

  9. 吉特仓库管理系统(开源)-如何在网页端启动WinForm 程序

    在逛淘宝或者使用QQ相关的产品的时候,比如淘宝我要联系店家点击旺旺图标的时候能够自动启动阿里旺旺进行聊天.之前很奇怪为什么网页端能够自动启动客户端程序,最近在开发吉特仓储管理系统的时候也遇到一个类似的 ...

随机推荐

  1. mysql 闪回表工具

    use HTTP::Date qw(time2iso str2time time2iso time2isoz); use POSIX; my $SDATE = strftime("%Y-%m ...

  2. Linux Shell常用命令手册(Updating)

    检查远程端口是否对bash开放: nc -nvv $IP $PORT telnet $IP $PORT 当前任务的前后台切换: Ctrl + z fg 截取变量前5个字符: ${variable:0: ...

  3. UVa 1151 (枚举 + MST) Buy or Build

    题意: 平面上有n个点,现在要把它们全部连通起来.现在有q个套餐,如果购买了第i个套餐,则这个套餐中的点全部连通起来.也可以自己单独地建一条边,费用为两点欧几里得距离的平方.求使所有点连通的最小费用. ...

  4. ehcache 分布式集群同步数据实例

    本文使用rmi方式,借鉴百度能搜到的文章,但是均不能做到数据同步,做了些改动完全没问题,更详细说明介绍百度即可.直奔主题,可运行的demo实例! 创建一个maven项目,配置pom pom.xml & ...

  5. 【转】android的消息处理机制(图+源码分析)——Looper,Handler,Message

    原文地址:http://www.cnblogs.com/codingmyworld/archive/2011/09/12/2174255.html#!comments 作为一个大三的预备程序员,我学习 ...

  6. mycat分布式mysql中间件(数据库切分概述)[转]

    mysql数据库切分 前言 通 过MySQLReplication功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时 候,我们还是会面临到扩展 ...

  7. Doing Homework(HDU 1074状压dp)

    题意:给你n个要做的作业,它们的名字.期限.可完成所需天数(必须连续)在规定期限不能完成要扣分(每天一分)求做作业顺序使扣分最少. 分析:作业数量较少,用状态压缩,做到第i种作业花费的天数dp[i]. ...

  8. HDU4614 Vases and Flowers 二分+线段树

    分析:感觉一看就是二分+线段树,没啥好想的,唯一注意,当开始摆花时,注意和最多能放的比大小 #include<iostream> #include<cmath> #includ ...

  9. Xcode中Info.plist文件各个键的作用说明【搜藏】

    Localiztion native development region --- CFBundleDevelopmentRegion 本地化相关,如果⽤户所在地没有相应的语言资源,则用这个key的v ...

  10. 在windows xp 平台上安装mvc4失败

    使用web 平台安装程序,在windows xp上安装mvc4 出现失败,需要主要是windows powershell 2.0安装失败,需要先卸载power shell 1.0或者 winowrm ...