语言:C/C++
本文有许多个人观点,仅供参考

基本定义

所谓的控制台就是DOS窗口(命令行窗口),那个黑框框.

“所谓的控制台应用程序,就是能够运行在MS-DOS环境中的程序。控制台应用程序通常没有可视化的界面,只是通过字符串来显示或者监控程序。控制台程序常常被应用在测试、监控等用途,用户往往只关心数据,不在乎界面。” ——来自百度百科

conhost.exe

conhost, Console Host Process, 即命令行程序的宿主进程。就是它控制控制台的。

最基础的程序运行出现的窗口就是控制台。

程序运行后,会调用conhost申请一个控制台窗口。

控制台运行spring boot 控制台运行是什么意思_字符串

此时程序仍然进行。

程序中的函数

程序会进行字符的输出,使用cout,printf,putchar等语句。这些语句会将字符串发送到conhost上,conhost将字符输出。

控制台运行spring boot 控制台运行是什么意思_应用程序_02

输入语句scanf,cin,getchar,gets,getc等,先让键盘的字符经过控制台进入缓冲区,当按下回车时进行读取,然后从conhost将字符串发送回程序中。

控制台运行spring boot 控制台运行是什么意思_应用程序_03

来自conio.h/curses.h的getch()则是直接从控制台摘去字符返回,不经过缓冲区也不显示到屏幕上;
kbhit()则可以检测控制台键盘是否被按下。

system()

system是调用dos命令的函数之一,在程序中有时会使用。

cls,color,mode con…,title,pause等都是系统自带的针对控制台设置的程序,分别进行 清屏、设置颜色、设置控制台属性、设置标题、暂停 等功能。

wincon.h里的一些函数,如SetConsoleTitle,SetConsoleTextAttribute等,也可以达到相应的效果。

控制台运行spring boot 控制台运行是什么意思_字符串_04

调整程序与控制台的函数

wincon.h里的函数

FreeConsole()
直接让conhost退出,脱离并退出控制台。

AllocConsole()
调用conhost,申请一个新的控制台窗口。

AttachConsole(pid)
参数填进程ID
BOOL WINAPI AttachConsole(__in DWORD dwProcessId);

让单独的程序进程附加指定进程的控制台,达到共用的目的。

注意
ShowConsole(GetConsoleWindow(),SW_HIDE);
这一句只能让控制台窗口隐藏,并不能释放conhost,所以控制台仍占据内存。如果你的程序不用控制台,最好要么用FreeConsole(),要么直接不要申请控制台.
(虽然我以前经常隐藏控制台)

项目工程都不会使用控制台,因为控制台不再满足人们的需要。他们自己注册窗口。
一个叫做subsystem的链接,可以让exe明白运行它的方式。将它调为windows则必须注册自己的窗口;将它调为console则会申请控制台。这也就是下面这条语句的用意所在。

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )