使用conio.h时如何对不同F功能键及方向键的按键输入进行标记识别
问题原因
conio.h 提供的 getch() 函数处理普通按键(字母、数字、回车、ESC等)时只会返回一个对应ASCII值,但处理方向键、F功能键这类扩展按键时,会连续返回两个值:
- 第一个返回值是固定先导码,通常为
0或224,仅用于标识当前按下的是扩展键 - 第二个返回值是该扩展键独有的扫描码,可用于区分不同的扩展键
你当前代码只读取了第一个返回值,才会出现不同扩展键返回值相同的问题。
常见扩展键扫描码参考
- 方向上:72
- 方向下:80
- 方向左:75
- 方向右:77
- F1:59
- F2:60
- F3:61
- F4:62
- F5:63
- F6:64
- F7:65
- F8:66
- F9:67
- F10:68
- F11:133
- F12:134
修正后代码示例
#include <stdio.h> #include <conio.h> int main() { int ch = getch(); // 先判断是不是扩展键先导码 if (ch == 0 || ch == 224) { // 读取第二个扫描码做判断 int scan_code = getch(); switch (scan_code) { case 75: printf("LEFT ARROW"); break; case 72: printf("UP ARROW"); break; case 77: printf("RIGHT ARROW"); break; case 80: printf("DOWN ARROW"); break; case 59: printf("F1"); break; case 60: printf("F2"); break; // 按需补充其他F键、扩展键的case default: printf("OTHER EXTENDED KEY, SCAN CODE: %d", scan_code); break; } } else { // 普通按键走原有逻辑 switch (ch){ case 13: printf("ENTER"); break; case 27: printf("ESC"); break; case 48 ... 57: // 范围写法简化数字判断,主流编译器均支持 printf("digit"); break; case 97 ... 122: printf("LOWERCASE LETTER"); break; // 按需补充其他普通按键的case default: printf("OTHER KEY, CODE: %d", ch); break; } } return 0; }
内容的提问来源于stack exchange,提问作者Geliebten
相关产品推荐
相关产品推荐

