以下示例使用控制台I / O的高级控制台I / O功能。有关高级控制台I / O功能的更多信息,请参阅高级控制台I / O.
该示例假定默认的I / O模式最初对第一次调用ReadFile和WriteFile功能生效。然后,输入模式更改为关闭线路输入模式和回波输入模式,用于第二次拨打ReadFile和WriteFile.SetConsoleTextAttribute功能用于设置随后写入的文本将显示的颜色。退出之前,程序恢复原始控制台输入模式和颜色属性。
当线路输入模式被禁用时,使用示例的NewLine功能。它通过将光标位置移动到下一行的第一个单元格来处理回车。如果光标已经在屏幕缓冲区的最后一行,屏幕缓冲区的内容将向上滚动一行。有关使用ScrollConsoleScreenBuffer功能滚动屏幕缓冲区的示例,请参阅滚动屏幕缓冲区的内容.
#include < windows.h >
VOID NewLine(VOID);
VOID ScrollScreenBuffer(HANDLE, INT);
HANDLE hStdout, hStdin;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
VOID main(void){
LPSTR lpszPrompt1 = "Type something and press Enter:\n";
LPSTR lpszPrompt2 = "Type any key: ";
CHAR chBuffer[256];
DWORD cRead, cWritten, fdwMode, fdwOldMode;
WORD wOldColorAttrs;
/ *获取STDIN和STDOUT的句柄。*/
hStdin = GetStdHandle(STD_INPUT_HANDLE);
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE ||
hStdout == INVALID_HANDLE_VALUE)
MyErrorExit("GetStdHandle");
/ *保存当前文本颜色。*/
if(!GetConsoleScreenBufferInfo(hStdout,& csbiInfo))
MyErrorExit("GetConsoleScreenBufferInfo");
wOldColorAttrs = csbiInfo.wAttributes;
/ *设置文本attr。在黑色背景上画红色文本。*/
if(!SetConsoleTextAttribute(hStdout,FOREGROUND_RED))
MyErrorExit("SetConsoleTextAttribute");
/*
*写入STDOUT并使用默认值从STDIN读取
*模式。InputFile自动回显输入
*输入回车之前不返回。
*
*默认输入模式为线,处理和回显。
*处理默认输出模式并在EOL进行换行。
*/
而(1){
if(!WriteFile(
hStdout,/ *输出句柄* /
lpszPrompt1,/ *提示符串* /
lstrlen(lpszPrompt1),/ * string length * /
& cWritten,/ * bytes written * /
NULL))/ *不重叠* /
break;
if(!ReadFile(
hStdin,/ *输入句柄* /
chBuffer,/ *缓冲区读入* /
255,/ *缓冲区大小* /
& cRead,/ *实际字节读* /
NULL))/ *不重叠* /
break;
if (chBuffer[0] == 'q') break;
}
/ *关闭线路输入模式,并回显输入模式。*/
if(!GetConsoleMode(hStdin,& fdwOldMode))
MyErrorExit("GetConsoleMode");
fdwMode = fdwOldMode &
~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
if(!SetConsoleMode(hStdin,fdwMode))
MyErrorExit("SetConsoleMode");
/ *提示输入。*/
if(!WriteFile(
hStdout,/ *输出句柄* /
lpszPrompt2,/ *提示符串* /
lstrlen(lpszPrompt2),/ * string length * /
& cWritten,/ * bytes written * /
NULL))/ *不重叠* /
MyErrorExit("WriteFile");
/*
*没有线和回声输入模式,ReadFile返回
*任何输入可用时。回车必须
*被处理,WriteFile用于回显输入。
*/
而(1){
if(!ReadFile(hStdin,chBuffer,1,& cRead,NULL))
break;
if (chBuffer[0] == '\r')
NewLine();
其他
if(!WriteFile(hStdout,chBuffer,cRead,
& cWritten,NULL))
break;
if (chBuffer[0] == 'q') break;
}
/ *恢复原始控制台模式。*/
if(!SetConsoleMode(hStdin,fdwOldMode))
MyErrorExit("SetConsoleMode");
/ *恢复原始文本颜色。*/
if(!SetConsoleTextAttribute(hStdout,wOldColorAttrs))
MyErrorExit("SetConsoleTextAttribute");
}
/*
*处理后,NewLine函数处理回车
*输入模式被禁用。它获取当前的光标位置
*并将其重置为下一行的第一个单元格。
*/
VOID NewLine(VOID){
if(!GetConsoleScreenBufferInfo(hStdout,& csbiInfo))
MyErrorExit("GetConsoleScreenBufferInfo");
csbiInfo.dwCursorPosition.X = 0;
/*
*如果是屏幕缓冲区的最后一行,请滚动
*缓冲区。
*/
if ((csbiInfo.dwSize.Y-1) == csbiInfo.dwCursorPosition.Y) {
ScrollScreenBuffer(hStdout, 1);
}
/ *否则,将光标移动到下一行。*/
其他
csbiInfo.dwCursorPosition.Y += 1;
if(!SetConsoleCursorPosition(hStdout,
csbiInfo.dwCursorPosition))
MyErrorExit("SetConsoleCursorPosition");
}