http://m.blog.youkuaiyun.com/blog/fa6507/8456096
当系统启动一个控制台程序时就会创建一个新的控制台,这个控制台程序的入口点为main函数。例如,系统在启动命令处理器(命令提示符)时就会创建一个新的控制台。一旦命令处理器启动了一个新的控制台程序,用户就可以指定系统是否为新的程序创建一个新的控制台,还是继承当前的命令处理器的控制台。
程序可以通过以下方法创建一个控制台:
- 一个GUI程序或控制台程序可以以CREATE_NEW_CONSOLE调用CreateProcess函数在一个新的控制台执行控制台程序。(通常,一个控制台程序会继承其父的控制台,并且其接收到的输入可能出乎意料。)
- 一个当前没有处在控制台中的图形界面(GUI)程序或控制台程序可以通过调用AllocConsole函数来创建一个新的控制台。(GUI一旦创建就不会处于控制台中,控制台程序如果是通过向CreateProcess函数传递DETACHED_PROCESS创建的话,也不处于控制台中.)
典型的,程序出现错误并需要用户交互时,就会使用AllocConsole创建一个控制台。如当GUI程序出现不能正常使用图形接口时,就会创建一个控制台;或者控制台程序不能与用户正常交互时,就会创建一个控制台提示错误产生。
当然,程序也可以调用CreateProcess时指定CREATE_NEW_CONSOLE标志来创建一个控制台。该方法创建的控制台可以访问其子程序,但不能访问父程序。父子控制台都可以单独同用户交互,而不产生任何冲突。如果控制台程序创建时没有指定该标志,两个程序就会同时使用一个控制台,而且,其中某个程序所需要的输入不能担保被正确接收。应用程序可以通过创建子程序以避免产生混淆,并且不要继承输入缓冲区的处理;或者同一时间仅允许子程序继承输入缓冲区处理,并阻止父程序读取输入直到子程序结束,也可以避免不必要的错误产生。
创建一个新控制台将产生一个新的控制台窗口,并使用单独的I/O屏幕缓冲区。程序通过GetStdHandle函数与新的控制台关联,以得到新控制台输入及屏幕缓冲区的句柄,通过这些句柄可以访问控制台。
使用CreateProcess,可以指定一个STARTUPINFO结构,该结构的成员控制着为子程序创建的第一个新控制台(如果有许多的话)。如果调用CreateProcess时指定了CREATE_NEW_CONSOLE标志,STARTUPINFO结构将影响控制台特性,同样也会影响子程序调用AllocConsole所创建的控制台。如下控制台特性可以被指定:
- 新控制台窗体的大小,按字符单元计
- 新控制台窗体的位置,按屏幕像素坐标计
- 新的控制台屏幕缓冲区的大小,按字符单元计
- 新控制台屏幕缓冲区的文本及背景色属性
- 新控制台窗体标题栏的显示名
如果STARTUPINFO的值未指定,系统将使用默认值。一个子程序可用通过调用GetStartupInfo函数确定STARTUPINFO的值。
程序不能改变本身的控制台窗口位置,但以下函数可以用来设置或获得STARTUPINFO结构的其他属性值。
函数 | 描述 |
---|---|
GetConsoleScreenBufferInfo | 获取窗体大小,屏幕缓冲区大小及颜色属性。 |
SetConsoleWindowInfo | 变更控制台窗体大小 |
SetConsoleScreenBufferSize | 变更控制台屏幕缓冲区大小 |
SetConsoleTextAttribute | 设置颜色属性。 |
SetConsoleTitle | 设置控制台窗口标题栏。 |
GetConsoleTitle | 得到控制台窗口标题栏。 |
一个程序可以通过调用FreeConsole函数与一个被继承的控制台分离,或者与通过调用AllocConsole创建的控制台分离。