这些键没有真正的 ascii 码,因此您需要查看这些键的扫描码,根据helppc 的信息,称为 Make 和 Break 键码。代码听起来“ascii”的原因是因为键代码由旧的 BIOS 中断 0x16 和键盘中断 0x9 处理。
正常模式 Num lock 开启
断断续续
向下箭头 E0 50 E0 D0 E0 2A E0 50 E0 D0 E0 AA
左箭头 E0 4B E0 CB E0 2A E0 4B E0 CB E0 AA
右箭头 E0 4D E0 CD E0 2A E0 4D E0 CD E0 AA
向上箭头 E0 48 E0 C8 E0 2A E0 48 E0 C8 E0 AA
因此,通过查看 E0 后面的代码来获取 Make 键码,例如分别为 0x50、0x4B、0x4D、0x48,这就是查看键码并将它们视为“ascii”时产生混淆的地方......答案是不要 因为平台不同,操作系统不同,在Windows下会有对应这些键的虚拟键码,不一定和BIOS码一样,VK_UP,VK_DOWN,VK_LEFT, VK_RIGHT.. 这可以在你的 C++ 头文件 windows.h 中找到,我记得在 SDK 的包含文件夹中。
不要依赖密钥代码来获得此处显示的相同“相同 ascii”代码,因为操作系统会以操作系统认为合适的方式重新编程整个 BIOS 代码,这自然是意料之中的,因为 BIOS 代码是16位,操作系统(现在是32位保护模式),当然那些来自BIOS的代码将不再有效。
因此原始键盘中断 0x9 和 BIOS 中断 0x16 将在 BIOS 加载后从内存中擦除,当保护模式操作系统开始加载时,它将覆盖该内存区域并用自己的 32 位保护模式替换它处理这些键盘扫描代码的处理程序。
这是一个使用 Borland C v3 的旧 DOS 编程代码示例:
#include <bios.h>
int getKey(void){
int key, lo, hi;
key = bioskey(0);
lo = key & 0x00FF;
hi = (key & 0xFF00) >> 8;
return (lo == 0) ? hi + 256 : lo;
}
这个例程其实返回的上、下代码分别是328和336,(我其实没有左右的代码,这是我的老菜谱里的!)实际的扫描码在@ 987654323@ 变量。 AZ,0-9 以外的键通过bioskey 例程的扫描代码为 0.... 添加 256 的原因,因为变量 lo 的代码为 0,而 hi 变量的代码为扫描代码并在其上添加256,以免与'ascii'代码混淆......