Win32编程调试信息的输出(Console)

原创 2015年07月08日 18:32:58

这几天做项目的时候想实时的输出调试信息。最先想到的就是Console。但是遇到了一个问题,关闭Console时整个程序退出了。在网上查了查,在这里总结一下。

Win32项目里创建标准的输出窗体函数AllocConsole().这个函数没有返回值,执行完成之后控制台就显示出来了

想向Console输出信息要先用GetStdHandle()来获取输出的HANDLE,参数就是STD_OUTPUT_HANDLE。

想要向控制台输出信息用WriteConsole(),具体参数不解释。

到此为止,是可以随便的输出调试信息了。

如果在程序运行时关闭了控制台,软件也会随之退出,这个不是我想要的,所以要监控控制台的关闭事件。

window是基于事件的,几乎任何操作都会有事件产生。想要捕获Console的事件,其实在程序开始的时候用

SetConsoleCtrlHandler()注册一下处理函数就OK了。
SetConsoleCtrlHandler()的第一个参数是一个WINAPI的回调函数,在这个回调函数中就可以截获控制台状态改变的信息。
在网上找了端现成的代码(如果这段代码侵犯了您的权利,请联系我534624117@qq.com):
BOOL WINAPI CtrlHandler( DWORD fdwCtrlType ) 
{ 
	switch( fdwCtrlType ) 
	{ 
		// Handle the CTRL-C signal. 
	case CTRL_C_EVENT: 
		printf( "Ctrl-C event\n\n" );
		Beep( 750, 300 ); 
		return( TRUE );

		// CTRL-CLOSE: confirm that the user wants to exit. 
	case CTRL_CLOSE_EVENT: 
		PostMessage(m_hwnd,WM_USER+10,0,0);//发送一个自定义事件,在程序的事件处理代码中将Console关闭
		return( TRUE ); 

		// Pass other signals to the next handler. 
	case CTRL_BREAK_EVENT: 
		Beep( 900, 200 ); 
		printf( "Ctrl-Break event\n\n" );
		return FALSE; 

	case CTRL_LOGOFF_EVENT: 
		Beep( 1000, 200 ); 
		printf( "Ctrl-Logoff event\n\n" );
		return FALSE; 

	case CTRL_SHUTDOWN_EVENT: 
		Beep( 750, 500 ); 
		printf( "Ctrl-Shutdown event\n\n" );
		return FALSE; 

	default: 
		return FALSE; 
	} 
}
然后调用注册函数:
SetConsoleCtrlHandler(CtrlHandler, TRUE);
这样在点击关闭控制台时就会进入:case CTRL_CLOSE_EVENT:,我在这发送了一个自定义的事件,主事件接收到之后主动用FreeConsole释放控制台,这样就能做到关闭控制台而不影响软件了。

Windows客户端开发--使用控制台窗口显示调试信息(打log)

从我们写第一行c++代码开始,应该大部分人使用的是win32控制台应用程序吧。后来,我们有了一定的C++知识,要进行具有图形界面的开发,也就是有窗口。这样,我们使用了win32应用程序。关于win32...

Win32汇编控制台下的几种输入输出方式

以下文章转自别人的帖子:在熟悉指令、伪指令和汇编语法的过程中, 首先需要的是输入、输出的手段.下面是之前尝试出的控制台输入、输出的几种办法:1、使用 MASM 提供的 StdIn、StdOut 函数;...

【转】VC++截取用户点击关闭按钮的消息

测试环境:VC++ 6.0 作者:hi.baidu.com/console_app(文章有改动) 批注:未完美解决问题,实现部分功能 批处理在运行的期间可以通过Ctrl+C或者点击窗体右上角的关...

win32程序启用控制台-- 调试输出

win32程序启用控制台(控制台文件名:conout$,conin$,conerr$)   2010-07-23 13:55:40|  分类: c++|字号 订阅 ...
  • yunhaiC
  • yunhaiC
  • 2015年08月21日 09:37
  • 3815

win32 编程之调试输出

在windows下编程时,不能再使用printf了,需要使用sprintf、wsprintf,或者采用MessageBox弹出对话框来输出相应的值。 #include int CDECL Mess...

win32 控制台 消息详解

Win32消息 一、消息概念 消息就是在事件驱动模式下,事件发布函数和具体功能执行函数(或者代码段)之间的调用协议,调用协议的执行表现为窗口事件发布函数跟具体功能执行函数(或者代码段)之间的选...

MFC程序如何使用printf输出调试信息

设想一下,我们在win32控制台下写了个在命令行运行的程序库,图方便直接用printf输出log来进行调试,但后来集成库时使用了MFC之类的窗体程序,于是原先用printf输出的log信息都看不到了,...
  • xhhjin
  • xhhjin
  • 2015年12月14日 18:19
  • 7777

如何在Win32窗口程序中发命令打开一个控制台,往里面打印(printf())输出一些数据

代码: AllocConsole(); HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE); unsigned long lgsize; WriteF...
  • ssmile
  • ssmile
  • 2012年08月08日 11:37
  • 4249

重温WIN32 API ------ C++日志类的实现

开发程序时,记录运行状态对于调试非常重要,从最简单好用的printf(),到VC++环境提供的TRACE宏,都是开发者的得力助手。其实打印记录程序运行状态的重要性还应该更加重要,不仅开发时,而且在部署...
  • smstong
  • smstong
  • 2014年12月22日 18:26
  • 3273

win32 app里使用控制台打印调试信息

HANDLE hOutput; void console_init(void) { AllocConsole(); SetConsoleTitle("Debug Window")...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Win32编程调试信息的输出(Console)
举报原因:
原因补充:

(最多只允许输入30个字)