Нет реальных кодов ascii для этих ключей как таковых, вам необходимо проверить коды сканирования для этих ключей, известные как коды клавиш Make и Break согласно информации helppc . Причина, по которой коды звучат как «ascii», заключается в том, что коды клавиш обрабатываются старым прерыванием BIOS 0x16 и прерыванием клавиатуры 0x9.
Normal Mode Num lock on
Make Break Make Break
Down arrow E0 50 E0 D0 E0 2A E0 50 E0 D0 E0 AA
Left arrow E0 4B E0 CB E0 2A E0 4B E0 CB E0 AA
Right arrow E0 4D E0 CD E0 2A E0 4D E0 CD E0 AA
Up arrow 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, как я помню, в папке include SDK.
Не полагайтесь на коды клавиш, чтобы иметь те же «идентичные коды ascii», показанные здесь, поскольку операционная система перепрограммирует весь код BIOS в том виде, в котором операционная система сочтет нужным, естественно, что это следовало ожидать, поскольку код BIOS является 16-битная и ОС (в настоящее время это 32-битный защищенный режим), конечно, эти коды из BIOS больше не будут действительны.
Следовательно, исходное клавиатурное прерывание 0x9 и BIOS-прерывание 0x16 будут стерты из памяти после того, как BIOS загрузит его, и когда ОС защищенного режима начнет загрузку, она перезапишет эту область памяти и заменит ее собственным 32-битным защищенным режимом. обработчики для обработки этих кодов сканирования клавиатуры.
Вот пример кода из старых дней программирования под DOS с использованием Borland C v3:
#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 соответственно (у меня нет кода слева и справа, это в моей старой кулинарной книге!) Фактический код сканирования находится в lo
переменная. Ключи, отличные от AZ, 0-9, имели код сканирования 0 с помощью процедуры bioskey
.... добавлена причина 256, потому что переменная lo
имеет код 0, а переменная hi
будет иметь отсканируйте код и добавьте к нему 256, чтобы не перепутать с кодами «ascii» ...