Using the High-Level Input and Output Functions
2010-05-11 19:04
337 查看
http://msdn.microsoft.com/en-us/library/ms686974%28v=VS.85%29.aspx #include <windows.h> void NewLine(void); void ScrollScreenBuffer(HANDLE, INT); HANDLE hStdout, hStdin; CONSOLE_SCREEN_BUFFER_INFO csbiInfo; void main(void) { LPSTR lpszPrompt1 = "Type a line and press Enter, or q to quit: "; LPSTR lpszPrompt2 = "Type any key, or q to quit: "; CHAR chBuffer[256]; DWORD cRead, cWritten, fdwMode, fdwOldMode; WORD wOldColorAttrs; // Get handles to STDIN and STDOUT. hStdin = GetStdHandle(STD_INPUT_HANDLE); hStdout = GetStdHandle(STD_OUTPUT_HANDLE); if (hStdin == INVALID_HANDLE_VALUE || hStdout == INVALID_HANDLE_VALUE) { MessageBox(NULL, TEXT("GetStdHandle"), TEXT("Console Error"), MB_OK); return; } // Save the current text colors. if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo)) { MessageBox(NULL, TEXT("GetConsoleScreenBufferInfo"), TEXT("Console Error"), MB_OK); return; } wOldColorAttrs = csbiInfo.wAttributes; // Set the text attributes to draw red text on black background. if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY)) { MessageBox(NULL, TEXT("SetConsoleTextAttribute"), TEXT("Console Error"), MB_OK); return; } // Write to STDOUT and read from STDIN by using the default // modes. Input is echoed automatically, and ReadFile // does not return until a carriage return is typed. // // The default input modes are line, processed, and echo. // The default output modes are processed and wrap at EOL. while (1) { if (! WriteFile( hStdout, // output handle lpszPrompt1, // prompt string lstrlenA(lpszPrompt1), // string length &cWritten, // bytes written NULL) ) // not overlapped { MessageBox(NULL, TEXT("WriteFile"), TEXT("Console Error"), MB_OK); return; } if (! ReadFile( hStdin, // input handle chBuffer, // buffer to read into 255, // size of buffer &cRead, // actual bytes read NULL) ) // not overlapped break; if (chBuffer[0] == 'q') break; } // Turn off the line input and echo input modes if (! GetConsoleMode(hStdin, &fdwOldMode)) { MessageBox(NULL, TEXT("GetConsoleMode"), TEXT("Console Error"), MB_OK); return; } fdwMode = fdwOldMode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT); if (! SetConsoleMode(hStdin, fdwMode)) { MessageBox(NULL, TEXT("SetConsoleMode"), TEXT("Console Error"), MB_OK); return; } // ReadFile returns when any input is available. // WriteFile is used to echo input. NewLine(); while (1) { if (! WriteFile( hStdout, // output handle lpszPrompt2, // prompt string lstrlenA(lpszPrompt2), // string length &cWritten, // bytes written NULL) ) // not overlapped { MessageBox(NULL, TEXT("WriteFile"), TEXT("Console Error"), MB_OK); return; } if (! ReadFile(hStdin, chBuffer, 1, &cRead, NULL)) break; if (chBuffer[0] == '/r') NewLine(); else if (! WriteFile(hStdout, chBuffer, cRead, &cWritten, NULL)) break; else NewLine(); if (chBuffer[0] == 'q') break; } // Restore the original console mode. SetConsoleMode(hStdin, fdwOldMode); // Restore the original text colors. SetConsoleTextAttribute(hStdout, wOldColorAttrs); } // The NewLine function handles carriage returns when the processed // input mode is disabled. It gets the current cursor position // and resets it to the first cell of the next row. void NewLine(void) { if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo)) { MessageBox(NULL, TEXT("GetConsoleScreenBufferInfo"), TEXT("Console Error"), MB_OK); return; } csbiInfo.dwCursorPosition.X = 0; // If it is the last line in the screen buffer, scroll // the buffer up. if ((csbiInfo.dwSize.Y-1) == csbiInfo.dwCursorPosition.Y) { ScrollScreenBuffer(hStdout, 1); } // Otherwise, advance the cursor to the next line. else csbiInfo.dwCursorPosition.Y += 1; if (! SetConsoleCursorPosition(hStdout, csbiInfo.dwCursorPosition)) { MessageBox(NULL, TEXT("SetConsoleCursorPosition"), TEXT("Console Error"), MB_OK); return; } } void ScrollScreenBuffer(HANDLE h, INT x) { SMALL_RECT srctScrollRect, srctClipRect; CHAR_INFO chiFill; COORD coordDest; srctScrollRect.Left = 0; srctScrollRect.Top = 1; srctScrollRect.Right = csbiInfo.dwSize.X - x; srctScrollRect.Bottom = csbiInfo.dwSize.Y - x; // The destination for the scroll rectangle is one row up. coordDest.X = 0; coordDest.Y = 0; // The clipping rectangle is the same as the scrolling rectangle. // The destination row is left unchanged. srctClipRect = srctScrollRect; // Set the fill character and attributes. chiFill.Attributes = FOREGROUND_RED|FOREGROUND_INTENSITY; chiFill.Char.AsciiChar = (char)' '; // Scroll up one line. ScrollConsoleScreenBuffer( h, // screen buffer handle &srctScrollRect, // scrolling rectangle &srctClipRect, // clipping rectangle coordDest, // top left destination cell &chiFill); // fill character and color }
相关文章推荐
- OpenCV_Tutorials——CORE MODULE.THE CORE FUNCTIONALITY—— File Input and Output using XML and YAML files
- Redirecting Standard Input/Output using the Process Class
- Redirecting Standard Input/Output using the Process Class
- OpenCV--File Input and Output using XML and YAML files
- The Python Tutorial 7——Input and Output
- C Standard Library: Character Input and Output Functions
- Android Build with Gradle and ProGuard : “The output jar must be specified after an input jar, or it
- Using the High Level Consumer
- The Python Tutorial - Input and Output
- C Standard Library: Direct Input and Output Functions
- xml无法显示(Cannot view XML input using XSL style sheet. Please correct the error and then click the Refresh button, or try again la
- How to use the CONVERSION_EXIT_PARVW_INPUT and CONVERSION_EXIT_PARVW_OUTPUT
- Redirecting Standard Input/Output using the Process Class
- SAS Graphics for Java: Examples Using SAS AppDev Studio and the Output Delivery System
- 20060801-Spatial transformations: Controlling the input and output grids with imtransform
- Python 3.3 Tutorial Notes - 5:Input and Output
- What is the difference between user level threads and kernel level threads?
- Excute shell and read the output
- Kalman Filters in the MRPT and using tips
- 特征学习“Building High-level Features Using Large Scale Unsupervised Learning”