windows API之控制台介面

來源:互聯網
上載者:User

標籤: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之控制台介面

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.