Что на самом деле получает getch()? Коды сканирования?

#include <conio.h>

int main (void)
{
    for (;;)
    {
        unsigned char ch = getch();
        printf ("0x%02X\n", ch);
    }
}

Я хочу получить код сканирования.

Вот описание из Википедии:

    Reads a character directly from the console without buffer, and without echo.

Когда я нажал Del, он показывает 0xE0 0x53.

Когда я нажал Ctrl+PgUp, он показывает 0xE0 0x86.

Хотя некоторые из них совпадают с таблицей, большинство значений, которые она показывает, отличаются от нее.

Итак, действительно ли getch() получает скан-коды?

Вот таблица кодов сканирования (набор 2, чаще всего используется)

Сканировать код


person Kevin Dong    schedule 10.01.2014    source источник
comment
Обычно я не осуждаю использование goto там, где это уместно. Но здесь это не уместно; бесконечный цикл был бы лучшим вариантом.   -  person glglgl    schedule 10.01.2014
comment
@glglgl Отредактировано. Спасибо за ваше предложение. :-)   -  person Kevin Dong    schedule 10.01.2014
comment
это действительно код, который вы используете? он должен печатать десятичное число с нулями, состоящее из 3 цифр, за которым следует шестнадцатеричный код. мне любопытно, что где-то нет ошибки, поскольку 0x86 кажется только невоспроизводимым. что происходит для цифровой клавиатуры pg up?   -  person user3125280    schedule 10.01.2014
comment
@ user3125280 Извините. Я отредактировал код.   -  person Kevin Dong    schedule 10.01.2014
comment
@KevinDongNaiJia, и это дает вам именно такие результаты? единственный способ, которым я могу видеть, что 0x86 создается из набора 1, когда клавиша 5 отпущена (0x80 + 0x06), и этому не будет предшествовать e0.   -  person user3125280    schedule 10.01.2014
comment
@ user3125280 Им должен предшествовать 0xE0. Посетите здесь.   -  person Kevin Dong    schedule 10.01.2014
comment
@KevinDongNaiJia конкретный пример, который я привел (из набора 1, а не в вашем случае), не будет включать 0xe0 - pg up и del оба делают. А как насчет цифровой клавиатуры pg up? что это вам дает?   -  person user3125280    schedule 10.01.2014
comment
@ user3125280 Извините, я использую ноутбук. :-(   -  person Kevin Dong    schedule 10.01.2014
comment
Какой компилятор вы используете? Веб-страница MSDN о _getch подразумевает, что она возвращает ANSI или UNICODE, а не сканирование коды. Взгляните на пример, который ищет 'y' или 'Y' .   -  person rcgldr    schedule 09.06.2017


Ответы (1)


Я запустил консольное приложение в VS 2012 (C++) и получил те же результаты, что и вы. Там было сказано, что getch() устарела и я должен использовать _getch(), но это не имело никакого значения.

Затем я нашел здесь таблицу, которая соответствует ей (крайний правый столбец). Для меня «белые» клавиши использовали сдвиг и эквиваленты цифровой клавиатуры, «серые» клавиши были автономными клавишами прокрутки страницы вверх, страницы вниз и т. Д. Единственное несоответствие, которое я обнаружил, это ввод на цифровой клавиатуре. так же, как обычная клавиша ввода.

http://www.itlnet.net/programming/program/Reference/msc/ng7d68f.html

Я не знаю, откуда взялась эта таблица, за исключением того, что если вы нажмете «О руководстве», там будет написано «База данных Microsoft C, авторское право (C) 1987, Питер Нортон». Откуда это у Питера, я не знаю.

person Nerf Herder    schedule 10.01.2014
comment
У Андриса Брауэра есть подробное обсуждение различных скан-кодов клавиатуры на его сайте: win.tue.nl/~aeb/linux/kbd/scancodes-1.html - person Nerf Herder; 10.01.2014
comment
Простите, если я ошибаюсь, но эта таблица похожа на другие стандартные таблицы, которые я нашел, и во всех них нет 0x86. - person user3125280; 11.01.2014
comment
дерьмо, ты прав. Я искал 86, но поиски Google продолжали придумывать другие вещи (x86), поэтому я сосредоточился на кодах страницы вниз, а не на кодах страницы вверх, и забыл проверить оба в конце. - person Nerf Herder; 15.01.2014
comment
Что ж, судя по внешнему виду таблицы, серый и белый ctrl pageup равны - возможно, ноутбук просто использует другой код сканирования, чтобы различать (даже если у него только один pageup). Может быть, если бы OP разместил больше кодов сканирования .. - person user3125280; 15.01.2014