1. 程式人生 > >windows API之控制檯介面

windows API之控制檯介面

    在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: 示例:

#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控制檯介面

    在windows裡面,使用者介面包括控制檯(Console)形式的和視窗(Window)形式的。控制檯形式的介面我們也是經常接觸的,不就是那個黑色的框框嗎?但是我們並沒有直接使用Windows API,通常我們呼叫printf來輸出、scanf來輸入。實際上,這個c語言函式也是通過Windows AP

《精通Windows.API-函式、介面、程式設計例項》範文慶.掃描版.pdf

書籍簡介: 《精通Windows API:函式、介面、程式設計例項》共18章,分為3個部分,第1部分(第1章-第3章)介紹Windows程式設計基礎;第2部分(第4章-第17章)按照程式設計的各個方面進行劃分,包括檔案系統、記憶體管理、程序與執行緒、使用者介面、Shell程式開發、Wind

Windows API SendMessage[user32]

 函式功能:該函式將指定的訊息傳送到一個或多個視窗。此函式為指定的視窗呼叫視窗程式,直到視窗程式處理完訊息再返回。而函式PostMessage不同,將一個訊息寄送到一個執行緒的訊息佇列後立即返回。     函式原型:LRESULT SendMessage(HWND hWnd,

《精通Windows API-函式、介面、程式設計例項》——第4章檔案系統

第4章檔案系統 4.2 磁碟和驅動器管理 檔案系統的基本概念: 包括磁碟分割槽,卷,目錄,檔案物件,檔案控制代碼,檔案對映 1.磁碟分割槽: 物理磁碟,邏輯磁碟 2.卷: 也稱邏輯驅動器,是NTFS,FAT32等檔案系統組織結構的最高層. 卷是

windows api 複製檔案到指定目錄和獲得系統資訊

#include <iostream> #include <WINDOWS.H> using namespace std; void copySelf() { char szSelfName[MAX_PATH] ; char szDestNa

Windows APIFindWindow和FindWindowEx函式

1 FindWindow函式: 函式功能:該函式獲得一個頂層視窗的控制代碼,該視窗的類名和視窗名與給定的字串相匹配。這個函式不查詢子視窗。在查詢時不區分大小寫。 函式型:HWND FindWindow(LPCTSTR IpClassN

Zookeeper C API介面描述

Zookeeper C API介面大部分以zoo_開頭,少量介面以zookeeper_開頭。 除了初始化/銷燬控制代碼、設定日誌等級/日誌流以及一些輔助功能的API外,Zookeeper C API介面分為同步介面和非同步介面:同步介面以zoo_開頭、非同步介面以zoo_a開頭。 1、初

CSS模擬實現windows控制檯介面

文章目錄 效果: 程式碼 製作流程 涉及知識點 如果你希望掌握 待改進之處 只從前天晚上學了CSS的部分知識後,現在看到什麼都想拆成CSS佈局來製作:所以就有了這件小De

Windows-API函式大全(API程序和執行緒函式)

API之程序和執行緒函式 CancelWaitableTimer 這個函式用於取消一個可以等待下去的計時器操作  CallNamedPipe 這個函式由一個希望通過管道通訊的一個客戶程序呼叫  ConnectNamedPipe 指示一臺伺服器等待下去,直至客戶機同一個命名管

【caffe-Windows】微軟官方caffe matlab介面配置

前言按照微軟的官方地址配置可能會出現一個問題caffe_.mexw64找不到引用模組問題,或者在matlab裡面壓根找不到caffe_這個函式,下面會提到這兩個問題。還是按照步驟來吧【PS1】有GPU同樣按照下述步驟,進行即可【PS2】文章在matlab2013a、matla

【caffe-windows】 caffe-master matlab介面配置

平臺環境: win10 64位 caffe-master  vs2013 Matlab2016a 第一步: 開啟\caffe-master\windows下的CommonSettings.props檔案, 更改MatlabSupport,改成true(即支援Matlab介面

Windows API入門系列五 -一個正兒八經的SDK程式

上一篇,講了一個簡單的SDK程式的多種版本的編寫,彈出了一個視窗,顯示了我們計算1到10的結果,計算的程式不是重點,重點在於,一:讓大家認識到Unicode版本的程式和ASCII版本的程式在程式設計方面的區別,以及怎麼樣編寫出通用程式碼的程式。二:怎麼樣運用API或者c++庫函式格式化非字元資料到一個字串

Windows API 程式設計建立一個windows視窗

直接上程式碼。 /************************************************************************************** * 問題:使用windows API函式建立一個window

【caffe-Windows】微軟官方caffe Python介面配置及圖片生成例項

前言 發現許多程式碼還是用python寫的,所以還是配置一下介面吧,雖然博主不會Python,咳咳。在這裡使用的python安裝包是anaconda2,注意使用Python2.7版本的那個安裝包。 百度雲:連結:http://pan.baidu.com/s/1nvrrfQ

Windows API學習路(二)

今天要講的是DeleteFile這個函式,這個函式用來刪除一個檔案函式原型:BOOL WINAPI DeleteFile( _In_ LPCTSTR lpFileName // 刪除檔名 );引數lpFileName 輸入引數所要刪除的檔案的相對路徑(如”1.txt”相

[轉]Web APi認證(Authentication)兩種實現方式【二】(十三)

用戶數 ted das 客戶 元素 基礎 目標 開始 net 本文轉自:http://www.cnblogs.com/CreateMyself/p/4857799.html 前言 上一節我們詳細講解了認證及其基本信息,這一節我們通過兩種不同方式來實現認證,並且分析如

Moodle 中文 API 文件管理API

reverse string bit /dev/ empty cte extra 回調函數 安全 File API 文件管理 文件夾 1. 概述 2. 文件域 2.1 命名文件域 3. 提供文件給用戶 4. 從用戶那獲取文件 5. 樣例

c#+windows api SetWindowsHookEx 全局鉤子 demo 下載

gravity set clas vsa con font mod img fontsize 效果圖 源代碼下載地址: http://download.csdn.net/detail/dhfekl/7522141 c#+windows a

百度地圖api----根據用戶ip定位城市

服務 利用 bsp result 城市 blog 經緯度 name 定位 LocalCity 這個類是利用用戶IP地址去百度數據庫裏查詢得到IP所在的城市,用法如下: var objCity = new BMap.LocalCity(); objCity.get(func

HBase概念學習(四)Java API掃描和過濾器

影響 產生 str 實例 分享 get 批量 java api track HBase主要的CRUD操作就不多介紹了,無非就是Put,Get。Delete三個類的運用。 本文相當於是閱讀HBase權威指南的總結。 一、掃描(Scan) 如今看一下掃