GUI程序也能使用控制台窗口

冷风 打造自己的GUI专版命令行程序 注:本文于07/4月于黑客防线发表版权归黑客防线所有,转载请注明出处  打造自己的GUI专版命令行程序  文/图 德州科技职业学院 冷风 命令行下的工具效率高,速度快,但是当程序的参数太多时,却不易于使用。所以我们就给它做个界面封装一下,顺 便把我们的大名也加上呵呵为了方便说明我们选用一个比较简单的程序GetOS.exe它是MS04011工具包中的一个小 工具,主要用来探测目标系统的类 阅读详情

很多时候,调试GUI程序是很不方便的,通常的做法是使用MessageBox,但是作为一个模态窗口,它经常产生不必要的消息,比如killfocus, setfocus或者paint,从而影响调试的执行过程。当然,使用vc的调试器也不错,但是这样也很容易造成窗口切换从而产生干扰消息。
因此,如果能像在控制台程序里那样使用cin/cout对象或printf族函数,会使得调试过程方便得多。而通常,windows是不会为GUI程序产生单独的命令行窗口的。所以我们是看不到使用标准输入输出流输出的东西的。既然系统不提供,那就自己动手“造”出一个来吧!


下面是一个简单的控制台窗口对象,它可以为你的程序创建一个命令行窗口,并将stdout,stdin和stderr重定向到这个命令行窗口。在程序中建立一个这样的对象之后,就可以直接使用cin/cout/*printf来操纵这个新的命令行窗口了!

.h文件
#ifndef _CUSTOM_CONSOLE_
#define _CUSTOM_CONSOLE_

#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <windows.h>

class Console
{
public:
 Console();
 Console(LPCTSTR lpszTitle, SHORT ConsoleHeight = 300, SHORT ConsoleWidth = 80);
 ~Console();

private:
 void Attach(SHORT ConsoleHeight, SHORT ConsoleWidth);
 static BOOL IsExistent;
};

#endif

.cpp文件

#include "***.h"

 BOOL Console::IsExistent = FALSE;

 Console::Console()
 {
  if (IsExistent)
   return;

  AllocConsole();
  Attach(300, 80);

  IsExistent = TRUE;
 }

 Console::Console(LPCTSTR lpszTitle, SHORT ConsoleHeight, SHORT ConsoleWidth)
 {
  if (IsExistent)
   return;

  AllocConsole();
  SetConsoleTitle(lpszTitle);
  Attach(ConsoleHeight, ConsoleWidth);

  IsExistent = TRUE;
 }

 void Console::Attach(SHORT ConsoleHeight, SHORT ConsoleWidth)
 {
  HANDLE  hStd;
  int     fd;
  FILE    *file;

// 重定向标准输入流句柄到新的控制台窗口

  hStd = GetStdHandle(STD_INPUT_HANDLE);
  fd = _open_osfhandle(reinterpret_cast<intptr_t>(hStd), _O_TEXT); // 文本模式
  file = _fdopen(fd, "r");
  setvbuf(file, NULL, _IONBF, 0); // 无缓冲
  *stdin = *file;

// 重定向标准输出流句柄到新的控制台窗口

  hStd = GetStdHandle(STD_OUTPUT_HANDLE);
  COORD size;
  size.X = ConsoleWidth;
  size.Y = ConsoleHeight;
  SetConsoleScreenBufferSize(hStd, size);
  fd = _open_osfhandle(reinterpret_cast<intptr_t>(hStd), _O_TEXT); //文本模式
  file = _fdopen(fd, "w");
  setvbuf(file, NULL, _IONBF, 0); // 无缓冲
  *stdout = *file;

// 重定向标准错误流句柄到新的控制台窗口

  hStd = GetStdHandle(STD_ERROR_HANDLE);
  fd = _open_osfhandle(reinterpret_cast<intptr_t>(hStd), _O_TEXT); // 文本模式
  file = _fdopen(fd, "w");
  setvbuf(file, NULL, _IONBF, 0); // 无缓冲
  *stderr = *file;

 }

 Console::~Console()
 {
  if (IsExistent)
  {
   FreeConsole();
   IsExistent = FALSE;
  }
 }


可以在WinMain里建立这个对象,若在main里建立这个对象,则同样会出现一个新的控制台窗口。
#ifdef _DEBUG // 当然,在release版里同样可以使用
Console notused;
#endif

使用AllocConsole在Win32窗口(GUI)程序中调用控制台调试输出 众所周知,Win32GUI程序默认不能使用调试窗口打印日志信息,那么,如何方便地在Win32GUI程序使用控制台进行调试输出?答案如题:AllocConsole函数和C-Runtime的freopen函数。其中"CONOUT$"是指代当前console的特殊字符串,"w"表明以written模式打开这个console,stdout指代标准输出流。可重定向的流有:标准输入流、标准输出流或者标准错误流。AllocConsole函数的功能是为当前的窗口程序申请一个Console窗口,其原型为。 阅读详情

相关推荐

R语言实战:5分钟搞定NHANES数据库的加权分析与可视化(附完整代码)

本文提供了一份R语言实战指南,帮助研究者在5分钟内完成NHANES数据库的加权分析与可视化。通过详细的代码示例,涵盖数据获取、清洗、加权分析和可视化全流程,特别适合公共卫生和流行病学研究者快速掌握复杂抽样数据的处理方法。

www00的博客 229

STM32H745xI双核芯片SMPS/LDO配置误区:从复位失败到精准排查的实战复盘

本文详细分析了STM32H745xI双核芯片在SMPS/LDO配置中的常见误区,特别是复位失败问题的排查过程。通过对比参考板与故障板的波形数据,揭示了电感选型不当导致的电源稳定性问题,并提供了硬件设计检查清单和调试技巧,帮助开发者避免类似陷阱。

weixin_42531588的博客 232

GUI程序显示控制台窗口

GUI程序调出控制台窗口

tongqingyan的博客 1043

什么是CLI(命令行界面)、GUI(图形用户界面)、Terminal(终端)、Console(控制台)、Shell、TTY

文章目录CLI (命令行界面)Terminal(终端)终端机字符终端 (Character Terminal)图形终端 (Graphical Terminal)Console (控制台)TTY 设备虚拟控制台 (Virtual Console)伪终端(Pseudo Terminal)LINUX下的终端Shell 程序猿都用过终端、Shell,并且经历越多会越来越发现他们的强大和无处不在。而很多小白和有工作经验但是半路出家的程序猿经常搞不清CLI、Shell、Console的概念,或者是会用但是不明所以。

UP的博客 3万+

计算机代码如何转换成指令的,将命令行程序转换为GUI

我为一个包含19个函数的简单调用创建了一个python脚本。我有问题,因为它不能在GUI模式下工作。我需要重新编码吗?我对GUI了解不多。有人能帮我一下吗。我试着读过关于GUI的书,我对这些步骤感到迷茫。在import mathq=1while q == True:print("Please select one option from the menu below: ")print("\t 0:...

weixin_34553878的博客 541

GUI程序如何使用控制台输出调试信息[zz][MFC调用win32窗口显示调试信息,使用AllocConsole 函数 ]...

地址:http://blog.csdn.net/huiyouyongdeyu2011/article/details/6556168 AllocConsole Function 为主调进程分配一个新的控制台。 语法 C++ : BOOL WINAPI AllocConsole(void); 参数: 无 返回值:如果函数成功,返回值是非零值;如果函数失败...

weixin_30369087的博客 125

在WinMain中嵌Console窗口

很多时候,调试GUI程序是很不方便的,通常的做法是使用MessageBox,但是作为一个模态窗口,它经常产生不必要的消息,比如killfocus, setfocus或者paint,从而影响调试的执行过程。当然,使用vc的调试器也不错,但是这样也很容易造成窗口切换从而产生干扰消息。 因此,如果能像在控制台程序里那样使用cin/cout对象或printf族函数,会使得调试过程方便得多。而通常,win

mergerly的专栏 1247

CUI & GUI in C++

int CUI Application#include #include DWORD WINAPI mainGUI( LPVOID lp){ HMODULE hInstance= 0; hInstance = GetModuleHandle(NULL); HWND hWnd; MSG msg; hWnd = CreateWindow("EDIT",

MoXiaoRab的专栏 2346

wxWidgets从控制台窗口创建GUI窗口

wxWidgets提供了两种程序类型:控制台程序GUI程序。有时为了方便调试或其它目的需要控制台窗口,或者从控制台创建窗口GUI窗口创建控制台窗口可以通过AllocConsole API函数实现,本文给出从控制台创建GUI窗口的方法。 一、原理 采用win32 API从控制台创建GUI窗口可以通过如下方式实现:include <windows.h> int main(int ...

weixin_34354945的博客 151

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

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

weixin_30266829的博客 136

控制台窗口显示和隐藏

本文展示了Fine语言中控制台窗口的隐藏与显示功能。通过创建GUI对象后,调用HideConsoleWindow()方法可隐藏控制台窗口使用ShowConsoleWindow()方法可重新显示。示例中先隐藏窗口,等待2秒后再显示,实现了控制台窗口的临时隐藏效果。这两个方法均无参数和返回值,操作简单直接

birdzhaojd的博客 71

隐藏Qt中的控制台窗口

Windows操作系统上,可以使用应用程序子系统(Subsystem)来隐藏Qt应用程序控制台窗口。在Qt中,默认的应用程序子系统是控制台(Console)子系统,因此会出现黑色的控制台窗口。在使用Qt编写应用程序时,有时候会遇到一个问题,即应用程序启动后会出现一个黑色的控制台窗口。在上面的示例代码中,我们使用Windows API中的WinMain函数作为应用程序的入口点,而不是Qt的main函数。通过这些步骤,Qt Creator将使用修改后的qmake参数来构建你的应用程序,并隐藏控制台窗口

FuJavascript的博客 2759

Qt程序 与 CMD窗口弹出的控制

Qt程序 与 CMD窗口弹出的控制 因为baidu 空间格式难易调节,富文本粘贴困难,本文停止更新,请访问:Qt Windows下链接子系统与入口函数(终结版) console 当希望程序运行时同时出现 cmd 窗口,我们只需要在 pro 文件内添加(这是一个常规用法): CONFIG += console 即可。 一般来说,我们都希望 debug 时出现 cmd 窗口,而 rel

quasiceo 1543

c# 很多代码是用c# 写的

代码 1//GeneratedbyReflectorfromC:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll2namespaceMicrosoft.Win323{4usingMicrosoft.Win32.SafeHandles;5...

weixin_30633405的博客 542

Eclipse插件(RCP)控制台(Console)个性化

文章介绍了Eclipse Console ,实现了在RCP项目中引入Console。并根据需求实现了对console视图的个性化定制,同时提供了源代码。

小子宝丁的博客 2506

SetConsoleScreenBufferSize

SetConsoleScreenBufferSize 编辑 SetConsoleScreenBufferSize 函数 更改指定的控制台屏幕缓冲区的大小。 语法 BOOL WINAPI SetConsoleScreenBufferSize( __in HANDLE hConsoleOutput, __in COORD dwSize )

3165

一个GUI程序如何创建一个控制台程序(CUI)

参考资料:http://www.cnblogs.com/linucos/archive/2012/09/10/2678972.html  下面这段代码演示GUI程序如何与它的控制台进行交互,包括向控制台输出字符和从控制台获取输入的字符。   void CreateConsole() { wchar_t szOutputTest[MAX_PATH] = L"晚春 韩愈\n草木知春不久归,

左雪菲的专栏 2031

企业领导人籍贯、毕业院校数据(1999-2024年).csv

企业领导人作为推动企业发展的核心驱动力,其个人特质与背景因素对企业战略决策、经营绩效及行业影响力的塑造至关重要整理了1999-2024年上市公司企业领导人籍贯、毕业院校数据,样本量达126.89万+条,主要包括姓名、年龄、专业、学历、毕业院校、具体职务、个人简历等指标利用该数据可深度剖析不同地域孕育的商业领袖分布特征,以及各高等学府对企业领导人才输出的贡献差异## 一、数据介绍数据名称:企业领导人籍贯、毕业院校数据数据范围:A股上市公司时间范围:1999-2024年样本数量:126.89万+条数据来源:上市公司年报更多说明:包括Excel、Stata两个版本

上一篇: Windows对象、句柄与MFC对象
下一篇: VC 小技巧代码
banward
博客等级 码龄18年 4粉丝 7原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值