C++ 控制台:写小应用/小游戏时各种技术上所需的小代码之合集(目前共23个)

目录:
设置打印颜色
COORD 类型结构体
延时 Sleep
设置控制台光标位置 SetConsoleCursorPosition
获取/设置控制台模式 GetConsoleMode / SetConsoleMode
获取鼠标在控制台的位置
system 函数
设置控制台标题 SetConsoleTitle
检测按键状态 GetKeyState / GetAsyncKeyState
检查控制台是否有键盘输入 _kbhit
读取键盘输入 _getch
设置控制台字体大小
蜂鸣 Beep
检索指定的系统指标或系统配置设置 GetSystemMetrics
设置窗口的大小 / 位置 / Z轴顺序 SetWindowPos
窗口显示 ShowWindow
合成击键事件 keybd_event
合成鼠标事件 mouse_event
合成键盘/鼠标事件 SendInput
弹出模态对话框 MessageBox
设置控制台光标信息 SetConsoleCursorInfo
生成伪随机数(低质量) rand
生成伪随机数(高质量) <random>
注:红字是输出/设置/合成,蓝字是输入/获取/检测。顺序随便排的。

1. 设置打印颜色(windows.h)
可封装为函数以简洁代码:


2. COORD 类型结构体(windows.h)
windows.h 中用于定义控制台屏幕缓冲区中字符单元格坐标的结构体类型。坐标系 (0,0) 的原点位于缓冲区的顶部左侧单元格。
COORD 是 coordinate(坐标)的简写。

3. 延时 Sleep(windows.h)

4. 设置控制台光标位置 SetConsoleCursorPosition(windows.h)
可封装为函数:

5. 获取/设置控制台模式 GetConsoleMode / SetConsoleMode(windows.h)
例如,我们可以写一个“禁用快速编辑模式”且“启用鼠标输入”的功能:
其它参数详见:
https://docs.microsoft.com/en-us/windows/console/getconsolemode
https://docs.microsoft.com/en-us/windows/console/setconsolemode

6. 获取鼠标在控制台的位置(windows.h)
与【5】配合使用。

7. system 函数(windows.h)
发出一个DOS命令。
可实现的功能较多,我只列举比较常用的几个:
其他的一些参数可见:https://blog.csdn.net/u010551600/article/details/23383411

8. 设置控制台标题 SetConsoleTitle(windows.h)

9. 检测按键状态 GetKeyState / GetAsyncKeyState (windows.h)
GetKeyState 函数返回一个 short 值,若其值为负,则按键被按下,否则未被按下。
你也可根据 GetKeyState(Key) >> 8 (即其返回值的高序位)的值(-1 / 0)判断按键状态(按下 / 没按下)。
你还可以用 GetAsyncKeyState(Key) >> 8 的值(-128 / 0)判断按键状态(按下 / 没按下),这个函数读取的是物理键状态,不管你怎么鼠标键盘映射,它只读取实际的按键状态。
附:虚拟键码对照表:
https://baike.baidu.com/item/虚拟键码
或 https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

10. 检查控制台是否有键盘输入 _kbhit(conio.h)
kbhit 为 _kbhit 函数的弃用别名,该函数仍受支持,但不建议使用。
_kbhit 函数检查控制台是否有最近的击键。如果函数返回一个非零值,则缓冲区中正在等待击键。然后程序可以调用 _getch 或 _getche 来获取击键。
你可以进行如下测试:

11. 读取键盘输入 _getch(conio.h)
getch 为 _getch 函数的弃用别名,该函数仍受支持,但不建议使用。
_getch 在 Windows 平台下从控制台无回显地取一个字符,返回值为 int 类型。
注意:在读取功能键(function key)或方向键时,这个函数必须调用两次:第一次调用返回 0 或 0xE0(即224),第二次调用返回实际的键码。
你可以进行如下测试:

12. 设置控制台字体大小(windows.h)

13. 蜂鸣 Beep(windows.h)
通过控制台扬声器播放蜂鸣声。
当然,输出转义字符 '\a' 也可实现短促响铃效果。

14. 检索指定的系统指标或系统配置设置 GetSystemMetrics
(windows.h)
例如:
其它参数见:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getsystemmetrics

15. 设置窗口的大小 / 位置 / Z轴顺序 SetWindowPos
(windows.h)
例如,我们可以置顶最顶层窗口(小工具版及该函数详细教程看这里):
你可以在这里了解它的更多用处:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowpos

16. 窗口显示 ShowWindow (windows.h)
示例:
更多参数见:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow

17. 合成击键事件 keybd_event(windows.h)
注:此函数已被取代,请改用SendInput。由于它使用起来很方便,我还是介绍一下吧。
通常我们只需要使用第一个和第三个参数(0 / KEYEVENTF_KEYUP)。下面是示例(选自百度百科):

18. 合成鼠标事件 mouse_event(windows.h)
注:此函数已被取代,请改用SendInput。由于它使用起来很方便,我还是介绍一下吧。
其中 dwFlags 可以是下列值的某种组合:
示例:

19. 合成键盘/鼠标事件 SendInput(windows.h)
该函数返回值是成功插入操作事件的个数。如果插入出错可以利用 GetLastError 来查看错误类型。
注意到插入的是 INPUT 结构的事件。故应该继续查看 INPUT 的相关内容。
其中 type 可以为如下值:

下面是一个实例(改自 Microsoft Docs):

20. 弹出模态对话框 MessageBox(windows.h)
其中最后一个参数 uType 可以为下列标志组中标志的组合,指定下列标志中的一个来显示消息框中的按钮以及图标:
· 按钮:
· 图标:
返回值:

示例 1:

示例 2:


21. 设置控制台光标信息 SetConsoleCursorInfo (windows.h)

22. 生成伪随机数(低质量) rand (stdlib.h)
返回从 0 到 RAND_MAX (32767) 范围内的一个伪随机整数(低质量)。
该 rand 函数生成已知序列,不适合用作加密函数。 若要生成加密型更安全的随机数,请使用 rand_s 或使用 <random> 中 C++ 标准库中声明的函数。
可以在此之前使用 srand 函数将随机数种子设置为 time(nullptr),否则每次运行将产生同样的结果。
返回MIN~MAX中一个随机整数 :
还可得到小于1的非负浮点数:
关于该函数的风险及优化(视频):https://learn.microsoft.com/zh-cn/events/goingnative-2013/rand-considered-harmful

23. 生成伪随机数(高质量) (random)
示例1:随机的unsigned整数(种子为time(nullptr))
示例2:随机的0~9整数(种子为time(nullptr))
主函数中 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/)。我没勾原创声明是因为我很多地方都是引用的那里面的话,而且绝大部分代码并非原创。