Как использовать специальные клавиши клавиатуры, такие как Command, Shift, Alt, Tab или функциональные клавиши внутри C / C ++ - программы? - PullRequest
0 голосов
/ 27 октября 2019

Моя проблема заключается в следующем:

Я хочу сделать программу, простой текстовый редактор, который может работать со всеми клавишами набора клавиатур, такими как функциональные клавиши (от F1 до F12), команда, Сдвиг влево, ALT или TAB.

Точнее, я хочу иметь возможность назначать все клавиши для определенных операций.

Я создал программу для распечатки значений ASCII этих ключей, но ключи не принимаются, как я хочу, моя тестовая программа распечатывает либо значения нескольких кодов ASCII, либо не принимаетэто все как при нажатии клавиши Command, вместо этого:

Моя тестовая программа для вывода значения ASCII нажатой клавиши:

#include <stdio.h> 

int main (void)
{
    char k;

    printf("\n\n\n\n");

    while(1)
    {

       printf("Please press any key:");

       k = getchar();
       getchar();

       printf("ASCII code of given input key: %d",k);
       printf("\n\n\n");
    }
}

Вывод после нажатия клавиши F2:

Please press any key:^[OQ
ASCII code of given input key: 27


Please press any key:ASCII code of given input key: 81

Вывод после нажатия клавиши F2:

Please press any key:^[[15~
ASCII code of given input key: 27


Please press any key:ASCII code of given input key: 49


Please press any key:ASCII code of given input key: 126

Вывод после нажатия клавиши Command, Alt или левой клавиши:

Please press any key:               // no reaction at all

Из-за того, что я думаю, что это должно быть сделано легко, потому что, конечно, нормально использовать все клавиши клавиатуры в программе, мне, как новичку, не так легко найти правильный способ достижениячто.

Я нашел этот вопрос здесь, на Stackoverflow, но он относится к C #: Специальные клавиши на клавиатурах

Почему я не могу получить значение ASCII этих клавиш?

Извините, если у меня может быть ошибочное впечатление, чтоВсе ключи принадлежат значениям ASCII.

1 Ответ

1 голос
/ 27 октября 2019

Доступ к «специальным клавишам» не является частью стандартной библиотеки, поскольку язык не предполагает какого-либо конкретного оборудования ввода-вывода, такого как экран и клавиатура, он предполагает только стандартные символьные потоки ввода-вывода и данные наэти потоки относятся к символам, а не к клавишам.

Как таковые, получают события клавиатуры и коды сканирования и специфические для платформы. Однако существуют кроссплатформенные средства, с помощью которых вы можете получить некоторую общность между системами, которые поддерживают клавиатуру (например, настольные компьютеры - не все, на чем работает C, является настольным компьютером).

Например, для приложений текстовой консоликак в вашем примере, вы можете использовать библиотеку ncurses, которая является клоном библиотеки проклятий Unix и имеет Windows-эквивалент в библиотеке PDcurses.

В этих вариантах проклятий, например, вы можете написать:

int ch = getch() ;
if(ch == KEY_LEFT)
    printw("Left arrow is pressed\n");

Под крышкой находится обертка для специальных средств платформы. Если кроссплатформенность не является проблемой, вы можете использовать эти средства напрямую. Например, MSVC ++ имеет библиотеку conio, которая имеет функцию _getch(), аналогичную описанной выше, за исключением того, что для не символьных ключей она возвращает 0x00 или 0xE0 и возвращает код клавиши при повторном вызове.

Для приложений с графическим интерфейсом цикл сообщений приложений будет получать события клавиатуры, точные средние значения будут различаться в разных системах, но опять же существуют кросс-платформенные решения, такие как, например, Qt или WxWidgets.

...