C++ 控制臺(tái):寫小應(yīng)用/小游戲時(shí)各種技術(shù)上所需的小代碼之合集(目前共23個(gè))

目錄:
設(shè)置打印顏色
COORD 類型結(jié)構(gòu)體
延時(shí)?Sleep
設(shè)置控制臺(tái)光標(biāo)位置?SetConsoleCursorPosition
獲取/設(shè)置控制臺(tái)模式 GetConsoleMode / SetConsoleMode
獲取鼠標(biāo)在控制臺(tái)的位置
system 函數(shù)
設(shè)置控制臺(tái)標(biāo)題?SetConsoleTitle
檢測按鍵狀態(tài)?GetKeyState /?GetAsyncKeyState?
檢查控制臺(tái)是否有鍵盤輸入 _kbhit
讀取鍵盤輸入 _getch
設(shè)置控制臺(tái)字體大小
蜂鳴 Beep
檢索指定的系統(tǒng)指標(biāo)或系統(tǒng)配置設(shè)置 GetSystemMetrics
設(shè)置窗口的大小 / 位置 / Z軸順序?SetWindowPos
窗口顯示 ShowWindow
合成擊鍵事件?keybd_event
合成鼠標(biāo)事件?mouse_event
合成鍵盤/鼠標(biāo)事件?SendInput
彈出模態(tài)對話框 MessageBox
設(shè)置控制臺(tái)光標(biāo)信息?SetConsoleCursorInfo
生成偽隨機(jī)數(shù)(低質(zhì)量)?rand
生成偽隨機(jī)數(shù)(高質(zhì)量) <random>
注:紅字是輸出/設(shè)置/合成,藍(lán)字是輸入/獲取/檢測。順序隨便排的。

1. 設(shè)置打印顏色(windows.h)
可封裝為函數(shù)以簡潔代碼:


2. COORD 類型結(jié)構(gòu)體(windows.h)
windows.h 中用于定義控制臺(tái)屏幕緩沖區(qū)中字符單元格坐標(biāo)的結(jié)構(gòu)體類型。坐標(biāo)系 (0,0) 的原點(diǎn)位于緩沖區(qū)的頂部左側(cè)單元格。
COORD 是 coordinate(坐標(biāo))的簡寫。

3. 延時(shí)?Sleep(windows.h)

4. 設(shè)置控制臺(tái)光標(biāo)位置?SetConsoleCursorPosition(windows.h)
可封裝為函數(shù):

5. 獲取/設(shè)置控制臺(tái)模式 GetConsoleMode / SetConsoleMode(windows.h)
例如,我們可以寫一個(gè)“禁用快速編輯模式”且“啟用鼠標(biāo)輸入”的功能:
其它參數(shù)詳見:
????https://docs.microsoft.com/en-us/windows/console/getconsolemode
????https://docs.microsoft.com/en-us/windows/console/setconsolemode

6.?獲取鼠標(biāo)在控制臺(tái)的位置(windows.h)
與【5】配合使用。

7. system?函數(shù)(windows.h)
發(fā)出一個(gè)DOS命令。
可實(shí)現(xiàn)的功能較多,我只列舉比較常用的幾個(gè):
其他的一些參數(shù)可見:https://blog.csdn.net/u010551600/article/details/23383411

8. 設(shè)置控制臺(tái)標(biāo)題?SetConsoleTitle(windows.h)

9. 檢測按鍵狀態(tài)?GetKeyState /?GetAsyncKeyState?(windows.h)
GetKeyState 函數(shù)返回一個(gè) short 值,若其值為負(fù),則按鍵被按下,否則未被按下。
? ??
????你也可根據(jù)?GetKeyState(Key) >> 8 (即其返回值的高序位)的值(-1 / 0)判斷按鍵狀態(tài)(按下 / 沒按下)。
????你還可以用?GetAsyncKeyState(Key) >> 8?的值(-128 /?0)判斷按鍵狀態(tài)(按下 / 沒按下),這個(gè)函數(shù)讀取的是物理鍵狀態(tài),不管你怎么鼠標(biāo)鍵盤映射,它只讀取實(shí)際的按鍵狀態(tài)。
附:虛擬鍵碼對照表:
????https://baike.baidu.com/item/虛擬鍵碼
????或?https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes? ? ??

10.?檢查控制臺(tái)是否有鍵盤輸入 _kbhit(conio.h)
kbhit?為 _kbhit?函數(shù)的棄用別名,該函數(shù)仍受支持,但不建議使用。
?_kbhit 函數(shù)檢查控制臺(tái)是否有最近的擊鍵。如果函數(shù)返回一個(gè)非零值,則緩沖區(qū)中正在等待擊鍵。然后程序可以調(diào)用 _getch 或 _getche 來獲取擊鍵。
你可以進(jìn)行如下測試:

11. 讀取鍵盤輸入 _getch(conio.h)
getch 為 _getch 函數(shù)的棄用別名,該函數(shù)仍受支持,但不建議使用。
_getch 在 Windows 平臺(tái)下從控制臺(tái)無回顯地取一個(gè)字符,返回值為 int 類型。
注意:在讀取功能鍵(function key)或方向鍵時(shí),這個(gè)函數(shù)必須調(diào)用兩次:第一次調(diào)用返回 0 或 0xE0(即224),第二次調(diào)用返回實(shí)際的鍵碼。
你可以進(jìn)行如下測試:

12. 設(shè)置控制臺(tái)字體大小(windows.h)

13. 蜂鳴 Beep(windows.h)
通過控制臺(tái)揚(yáng)聲器播放蜂鳴聲。
當(dāng)然,輸出轉(zhuǎn)義字符 '\a'?也可實(shí)現(xiàn)短促響鈴效果。

14.?檢索指定的系統(tǒng)指標(biāo)或系統(tǒng)配置設(shè)置 GetSystemMetrics?
(windows.h)
例如:
其它參數(shù)見:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getsystemmetrics

15. 設(shè)置窗口的大小 / 位置 / Z軸順序?SetWindowPos?
(windows.h)
例如,我們可以置頂最頂層窗口(小工具版及該函數(shù)詳細(xì)教程看這里):
你可以在這里了解它的更多用處:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowpos

16. 窗口顯示 ShowWindow?(windows.h)
示例:
更多參數(shù)見:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow

17. 合成擊鍵事件?keybd_event(windows.h)
注:此函數(shù)已被取代,請改用SendInput。由于它使用起來很方便,我還是介紹一下吧。
通常我們只需要使用第一個(gè)和第三個(gè)參數(shù)(0 / KEYEVENTF_KEYUP)。下面是示例(選自百度百科):

18. 合成鼠標(biāo)事件?mouse_event(windows.h)
注:此函數(shù)已被取代,請改用SendInput。由于它使用起來很方便,我還是介紹一下吧。
其中 dwFlags?可以是下列值的某種組合:
示例:
(夾帶私貨)我用這玩意兒做過一個(gè)連點(diǎn)器。

19. 合成鍵盤/鼠標(biāo)事件?SendInput(windows.h)
該函數(shù)返回值是成功插入操作事件的個(gè)數(shù)。如果插入出錯(cuò)可以利用 GetLastError 來查看錯(cuò)誤類型。
注意到插入的是 INPUT 結(jié)構(gòu)的事件。故應(yīng)該繼續(xù)查看 INPUT 的相關(guān)內(nèi)容。
其中 type 可以為如下值:

下面是一個(gè)實(shí)例(改自 Microsoft Docs):

20.?彈出模態(tài)對話框 MessageBox(windows.h)
其中最后一個(gè)參數(shù) uType 可以為下列標(biāo)志組中標(biāo)志的組合,指定下列標(biāo)志中的一個(gè)來顯示消息框中的按鈕以及圖標(biāo):
· 按鈕:
· 圖標(biāo):
返回值:

示例 1:

示例 2:


21. 設(shè)置控制臺(tái)光標(biāo)信息?SetConsoleCursorInfo (windows.h)

22. 生成偽隨機(jī)數(shù)(低質(zhì)量)?rand?(stdlib.h)
?返回從 0 到 RAND_MAX?(32767)?范圍內(nèi)的一個(gè)偽隨機(jī)整數(shù)(低質(zhì)量)。
該 rand 函數(shù)生成已知序列,不適合用作加密函數(shù)。 若要生成加密型更安全的隨機(jī)數(shù),請使用 rand_s 或使用 <random>?中 C++ 標(biāo)準(zhǔn)庫中聲明的函數(shù)。
可以在此之前使用 srand?函數(shù)將隨機(jī)數(shù)種子設(shè)置為 time(nullptr),否則每次運(yùn)行將產(chǎn)生同樣的結(jié)果。
返回MIN~MAX中一個(gè)隨機(jī)整數(shù)?:
還可得到小于1的非負(fù)浮點(diǎn)數(shù):
關(guān)于該函數(shù)的風(fēng)險(xiǎn)及優(yōu)化(視頻):https://learn.microsoft.com/zh-cn/events/goingnative-2013/rand-considered-harmful

23. 生成偽隨機(jī)數(shù)(高質(zhì)量)?(random)
示例1:隨機(jī)的unsigned整數(shù)(種子為time(nullptr))
示例2:隨機(jī)的0~9整數(shù)(種子為time(nullptr))
主函數(shù)中 uniform_int_distribution 可替換為:

示例3:泊松分布

了解更多:https://learn.microsoft.com/zh-cn/cpp/standard-library/random?view=msvc-170

主要參考資料來自 Microsoft Docs(https://docs.microsoft.com/)和百度百科(https://baike.baidu.com/)。我沒勾原創(chuàng)聲明是因?yàn)槲液芏嗟胤蕉际且玫哪抢锩娴脑挘医^大部分代碼并非原創(chuàng)。