
windows平台用GetAsyncKeyState检测任意键是否按下
控制台程序无法直接响应按键事件,必须轮询系统状态。Windows API 提供的 GetAsyncKeyState 是最轻量、最常用的方式,它不阻塞、不吞键、能检测组合键(如 Ctrl+C),适合实时响应。
关键点:参数传入虚拟键码(如 VK_SPACE、'A'),返回值最低位为1表示该帧被按下(注意不是“按住”)。
- 需包含头文件:
#include <windows.h></windows.h> - 虚拟键码可查 MSDN,字母键可直接用大写 ASCII 值(
'A'等价于0x41) - 频繁调用时建议加
Sleep(1)防止 CPU 占满,但会引入约 1ms 延迟 - 不能检测输入法上屏后的字符,只管物理按键动作
linux/macos 下用termios关闭回显并设为非缓冲模式
POSIX 系统没有类似 GetAsyncKeyState 的 API,得靠改造终端行为:禁用行缓冲(ICANON)、关闭回显(echo)、设最小读取字节数为 1(MIN = 1),才能做到按一个键立刻返回。
注意这不是“监听”,而是让 read() 变成准实时——每次调用最多等一个键,不等回车。
立即学习“C++免费学习笔记(深入)”;
- 必须在程序启动时保存原始
termios结构,退出前恢复,否则终端会乱(比如输命令没反应) -
stdin文件描述符是 0,read(0, &ch, 1)就能拿到单字节 - 方向键、功能键会发 ESC 序列(如 ← 是