標籤:windows api
windows API之控制台介面
tkorays ([email protected])
在windows裡面,使用者介面包括控制台(Console)形式的和視窗(Window)形式的。控制台形式的介面我們也是經常接觸的,不就是那個黑色的框框嗎?但是我們並沒有直接使用Windows API,通常我們調用printf來輸出、scanf來輸入。實際上,這個c語言函數也是通過Windows API來實現的。不信的話,可以開啟crtdll.dll查看裡面的字串。
關於Console的API不是很多,主要包括,擷取控制台控制代碼,控制台輸入輸出,控制台樣式設定。下面逐一介紹:
1) HANDLE WINAPI GetStdHandle(_in_ DWORD nStdHandle); 根據參數擷取控制代碼。標準輸入控制代碼為STD_INPUT_HANDLE,標準輸出控制代碼為STD_OUTPUT_HANDLE,或者設定為錯誤控制代碼STD_ERROR_HANDLE。
2) BOOL WINAPI WriteConsole( _in_ HANDLE hConsoleOutput, // 標準輸出控制代碼 _in_ const VOID* lpBuffer, // 輸出內容緩衝區指標 _in_ DWORD nNumberOfCahrsToWrite, // 緩衝區內容大小 _out_ LPDWORD lpNumberOfCharsWriten // 實際輸出字元數 LPVOID lpReseverd); // 保留參數,置為NULL即可
3) BOOL WINAPI ReadConsole( _in_ HANDLE hConsoleInput, // 標準輸入控制代碼 _out_ LPVOID lpBuffer, // 儲存讀入字元的緩衝區指標 _in DWORD nNumberOfCharsToRead, // 緩衝區大小 out_ LPDWORD lpNumberOfCharsRead, // 實際讀入字元 _in_opt_ LPVOID pInoutControl // 輸入控制在,這是一個指向CONSOLE_READCONSOLE_CONTROL結構體的指標,可置為NULL);
4) BOOL WINAPI GetConsoleScreenBufferInfo _In_ HANDLE hConsoleOutput, // 標準輸出控制代碼 _Out_ PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo // CONSOLE_SCREEN_BUFFER_INFO結構體指標,用於儲存控制台字型顏色等資訊,這個可以用來恢複初始設定,即先擷取儲存控制台資訊,在之後修改後還可以通過這個變數來恢複設定 ); CONSOLE_SCREEN_BUFFER_INFO結構體定義如下: typedef struct _CONSOLE_SCREEN_BUFFER_INFO { COORD dwSize; COORD dwCursorPosition; WORD wAttributes; SMALL_RECT srWindow; COORD dwMaximumWindowSize; } CONSOLE_SCREEN_BUFFER_INFO;
5) BOOL WINAPI SetConsoleTextAttribute( _In_ HANDLE hConsoleOutput, // 標準輸出控制代碼 _In_ WORD wAttributes // 文字屬性的組合,前景色彩、背景色等 ); 比如設定前景色彩紅色,顏色加強: SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY) 注意幾種顏色組合會變成其他顏色
6) BOOL WINAPI FillConsoleOutputAttribute( _In_ HANDLE hConsoleOutput, // 輸出控制代碼 _In_ WORD wAttribute, // 顏色 _In_ DWORD nLength, // 填充單元格數量 _In_ COORD dwWriteCoord, // 填充座標 _Out_ LPDWORD lpNumberOfAttrsWritten // 實際改變情況);
7) 其他 GetConsoleTitle/SetConsoleTitle 擷取/設定控制台標題 FillConsoleOutputAttribute 設定文字單元的屬性,從Fill一詞可以看出,這個是填充效果 FillConsoleOutputCharacter 填充字元 SetConsoleCursorPosition 設定游標位置 擷取、設定字型等。
更多用法請參考msdn:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx
樣本:
#include <stdio.h>#include <Windows.h>int main(int argc, char** argv){HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); // 擷取輸出控制代碼HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); // 擷取輸入控制代碼CONSOLE_SCREEN_BUFFER_INFO backInfo;GetConsoleScreenBufferInfo(hStdout, &backInfo); // 儲存原始資訊DWORD dwSize;// 設定顏色WriteConsoleA(hStdout, "I'm tkorays.\n", 13, &dwSize, NULL); // 未設定字型顏色,內容為ASCII編碼SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY);WriteConsole(hStdout, L"hello\n", 6, &dwSize, NULL); // 設定顏色後輸出,UNICODE編碼SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN | FOREGROUND_INTENSITY);system("pause"); // 暫停下,看前面的效果LPWSTR lpChar = (LPWSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 2048);COORD coord; // 相對座標coord.X = 0;coord.Y = 0;CONSOLE_SCREEN_BUFFER_INFO csbi;GetConsoleScreenBufferInfo(hStdout, &csbi); // 擷取此時螢幕緩衝ReadConsoleOutputCharacter(hStdout, lpChar, 2047, coord, &dwSize); // 擷取螢幕緩衝// 顏色數組,用於後面設定WORD wColors[3];wColors[0] = BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN;wColors[1] = BACKGROUND_RED | BACKGROUND_GREEN;wColors[2] = BACKGROUND_GREEN;// 修改螢幕緩衝DWORD dwLen;for (size_t i = 0; i < dwSize; i++){// 螢幕中的小寫字母改變樣式if (lpChar[i] >= 'a'&&lpChar[i] <= 'z'){// 計算字元座標coord.Y = i / csbi.dwSize.X;coord.X = i%csbi.dwSize.X;WriteConsoleOutputAttribute(hStdout, wColors, 1, coord, &dwLen);}}// 恢複原始字型顏色SetConsoleTextAttribute(hStdout, backInfo.wAttributes);return 0;}
結果:
運行到system("pause");處:
修改小寫字母樣式後:
windows API之控制台介面