一、基本概念
Windows的用户界面分为两个部分:字符图形界面和图形用户界面。字符图形界面较为简单,主要内容包括如何在界面上读取用户输入,如何向界面终端输出信息。如何控制界面的字体、背景、颜色等。
字符界面的人机交互接口只有一种,称作控制台( Console)。用户通过控制台向应用程序输入命令和数据,应用程序将运行结果或提示信息等显示在控制台上。如cmd.exe。
字符界面应用程序的所有输入和输出都是通过Console,字符界面相关的API函数都是通过Console的句柄来操作控制台的。
Console句柄分为两种,标准输入(Stand In)句柄和标准输出(Stand Out)句柄,分别用于从界面上读取输入和向界面输出。
大多数情况下,字符界面应用程序都只有一个控制台窗口,其标准输入句柄和标准输出句柄都代表了这个控制台。然而它们确实是两个句柄,所能进行的操作和权限是不一样的。如果使用“标准输入句柄”作为参数,调用WriteConsole等用于控制台输出的API函数是会产生错误的。
1、字符单元(Cell)
控制台的最小单元是字符单元。一个字符单元可以放置一个字符。字符单元是对控制台进行操作的最小单元。所有的属性修改操作也都是以字符单元为单位的。
实际上,类似于printf等标准C函数在Windows系统中都是通过系统的动态链接库crtdll.dll导出,printf函数的实现也位于crtdll.dll中,分析printf等函数的实现代码可以发现,在Windows平台上,实际printf函数在做了格式化字符串的处理后,是调用WriteConsole等API函数进行界面操作的。
2、控制台子系统
Windows系统的应用程序分别运行于若干子系统。其中Windows和Consle是两个最常用到的子系统,图形用户界面的程序运行于Windows子系统,控制台界面的程序运行于Consle子系统。图形用户界面的应用程序窗口是由应用程序调用API函数创建的,而控制台应用程序的控制台界面并不需要应用程序创建,系统会为其自动创建。
3、控制台读写
使用Windows API向控制台写入数据获从控制台获取输入的过程如下:
◇使用GetStdHandle函数获取本应用程序的控制台标准输入、输出句柄(当然需要本应用程序是一个控制台程序,具有一个控制台。控制台程序在链接时需要选择子系统为CONSOLE,链接选项:/SUBSYSTEM:CONSOLE)。
◇以标准输出句柄为参数,调用WriteConsole API写入输出。
◇以标准输入句柄为参数,调用ReadConsole API读取输入。
更多Consoles and Character-Mode Support,可以参见[1,2]。
[1] 精通Windows API 函数、接口、编程实例
[2] http://msdn.microsoft.com/en-us/library/ms682010%28VS.85%29.aspx