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

2008年10月11日 星期六 下午 04:43

在Win32的GUI程序中,没有控制台窗口,我们输出调试信息时有些不方便,以往我的做法是使用MessageBox弹出对话框、OutputDebugString向VS的调试窗口输出信息等,但总感觉不如控制台输出几句printf有效率。经过尝试发现GUI程序照样能够拥有(且仅能够拥有一个)控制台窗口,具体做法如下:

#include <locale.h>

在程序初始化时,加入以下代码:

FILE* fpDebugOut = NULL; 
FILE* fpDebugIn   = NULL; 
if( !AllocConsole() ) MessageBox(NULL, _T("控制台生成失败。"), NULL, 0); 
SetConsoleTitle(_T("Debug Window")); 
_tfreopen_s(&fpDebugOut, _T("CONOUT$"),_T("w"), stdout); 
_tfreopen_s(&fpDebugIn, _T("CONIN$"), _T("r"), stdin); 
_tsetlocale(LC_ALL, _T("chs"));     //这是必要的,否则unicode模式下使用C库函数控制台输出不了中文 WriteConsole函数不受影响

注意AllocConsole可能失败,原因可能是程序已经于一个控制台窗口关联过了,等等。

程序结束时,加入以下代码:

fclose(fpDebugOut); 
fclose(fpDebugIn); 
FreeConsole();

好,现在已经加入了控制台,可以输出字符串了,使用标准的C库函数或者WriteConsole都可以:

使用WriteConsole的话前面其实不用调用freopen重定向输出流了,直接WriteConsole就行:

TCHAR str[256]; 
    DWORD numOfCharWritten = 0; 
    _stprintf_s(str, 256, _T("今年是 %d 年\n"), 2008); 
    WriteConsole( GetStdHandle(STD_OUTPUT_HANDLE), str, _tcslen(str), &numOfCharWritten, NULL);

使用C库函数则更简单,但上面一定要调用freopen才有效:

int tmp = 0; 
_tscanf_s(_T("%d\n"), &tmp); 
_tprintf_s(_T("刚才输入的是 %d\n"), tmp);

比如在响应WM_PAINT消息时,加入_tprintf_s(_T("重绘 %d 次\n"), ++count),则每次窗口绘制的时候都将输出总重绘次数。

最后,定义两个宏图省事:

#define CREATE_DEBUG_CONSOLE \ 
FILE* fpDebugOut = NULL; \ 
FILE* fpDebugIn = NULL; \ 
FILE* fpDebugErr = NULL; \ 
if( !AllocConsole() ) \ 
   MessageBox(NULL, _T("控制台生成失败。"), NULL, 0); \ 
SetConsoleTitle(_T("Debug Window")); \ 
_tfreopen_s(&fpDebugOut, _T("CONOUT$"),_T("w"), stdout); \ 
_tfreopen_s(&fpDebugIn, _T("CONIN$"), _T("r"), stdin); \ 
_tfreopen_s(&fpDebugErr, _T("CONOUT$"),_T("w"), stderr); \ 
_tsetlocale(LC_ALL, _T("chs"));

#define RELEASE_DEBUG_CONSOLE \ 
fclose(fpDebugOut); \ 
fclose(fpDebugIn); \ 
fclose(fpDebugErr); \ 
FreeConsole();

 

给Win32 GUI程序增加控制台窗口的方法的更多相关文章

  1. WinForm程序启动控制台窗口Console

    本文转载:http://blog.csdn.net/oyi319/article/details/5753311 2.WinForm程序和控制台窗口Console 如果你调试过SharpDevelop ...

  2. 用 PHP-GTK2 做 Win32 GUI 程序

    PHP通常是做为服务器端脚本执行,如果告诉你PHP可以编写普通的GUI程序,你应该很感兴趣.下面介绍的PHP-GTK就是PHP的GUI扩展.GTK是一个业界标准的图形库,具有良好的移植性.如果你用过l ...

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

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

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

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

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

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

  6. Win32控制台程序和Win32应用程序

    刚接触Windows那一套,大多数概念都还没建立起来,整理了一下网上对“Win32控制台程序”的理解,谢谢各位网友了. win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运 ...

  7. MFC如何在有界面的应用程序中开启控制台窗口

    在有界面的应用程序中开启控制台窗口有时候非常有用,尤其是在调试多线程应用程序中,由于通过断点的方式调试程序时会导致线程挂起从而导致各种难于预料的结果.这时候就可以通过开启控制台窗口往窗口输出信息来查看 ...

  8. win32应用程序和win32控制台应用程序的区别

          win32应用程序是有窗体的(当然也可以没有),有Windows消息循环机制的.而win32控制台应用程序只是在控制台下运行的程序,类似以前dos的程序. 后续答案: Win32 Appl ...

  9. VS2013中,将Qt的GUI程序改为控制台程序

    在Visual studio 中创建QT GUI程序是不带Console的,但是调试时候常常需要查看打印信息,可以通过如下设置显示控制台 方法一.在vs中直接创建控制台程序方法二.当你通过设置你的应用 ...

随机推荐

  1. Java类成员变量的默认值

    1.布尔型(boolean)变量默认值为false,byte.short.int.long为0,字符型为'\u0000'(空字符),浮点型(float double)为0.0,引用类型(String) ...

  2. p2693 Combination Lock

    深搜,注意模n.用set去重. #include <iostream> #include <cstdio> #include <cmath> #include &l ...

  3. android ------- 运行官方NDK 案例HelloJNI

    下载案例 HelloJNI ,导入工程到Eclipse,  可以直接下载我的案例, 源码下载:https://github.com/DickyQie/android-ndk 目录图 使用命令生成  . ...

  4. Robbers' watch CodeForces - 685A (暴力)

    大意: 一天n小时, m分钟, 表以7进制显示, 求表显示数字不同的方案数 注意到小时和分钟部分总长不超过7, 可以直接暴力枚举. 关键要特判0, 0的位数要当做1来处理 #include <i ...

  5. 谈一谈HashMap类

    一.Java中的hashCode()和equals() 1. hashCode()的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode()是用来在散列存储结构中确定对 ...

  6. 伪分布式&&完全分布式&&高可用(zookeeper)的配置文件内容

    [伪分布式] ①[core-site.xml] <configuration> <property> <name>fs.defaultFS</name> ...

  7. element-ui radio 再次点击取消选中

    <el-radio-group v-model="radio2"> <el-radio @click.native.prevent="clickitem ...

  8. canvas移动端兼容性问题总结

    项目简介:在网页利用canvas在图片中动态绘制文字,合成一张图片,并导出 遇到的问题: 1.在移动端canvas drawImage()方法图片无法绘制出来,只显示文字 原因:图片未加载就进行绘制, ...

  9. win php安装 oracle11 g

    1.下载plsql和oracle11g plsql安装比较简单,就是普通的安装.oracle11 g不用安装, 下面我讲解一下win 64位的系统配置oracle: (1).首先我使用的是warpse ...

  10. MongoDB 教程(四):MongoDB 概念解析

    概述: 不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档.集合.数据库,下面我们挨个介绍. 下表将帮助您更容易理解Mongo中的一些概念: 数据库 先运行数据库 C: ...