2013-03-11 5 views
2

Я пишу интерфейс командной строки для консольной программы на Linux. Я хочу иметь возможность использовать в нем такие клавиши, как стрелки. Поэтому, чтобы зафиксировать коды, я использую эту простую программу:Захват ключа HOME с помощью getchar()

int main() 
{ 
    int c = 0; 
    while (c != 3) { // ctrl-c 
     c = getchar(); 
     printf("%d\n", c); 
    } 
} 

Выполнение этого У меня были проблемы с записью ключа HOME. На одном компьютере я получил последовательность «27 91 72», на другой я получил «27 79 72», а на третьем я получил «27 91 49 126».

Я не уверен, почему я получаю так разные коды на клавишах HOME и END (клавиши Arrows и F1-F12 дали одну и ту же последовательность на трех компьютерах).

Есть ли стандартный способ получить эти ключи или какую-то конфигурацию, которая даст мне такую ​​же последовательность на всех машинах?

+0

Управляющие коды, посылаемые «специальных» ключей различаются типа терминала, и, что еще хуже, они не обязательно образуют код префикса. Вы должны использовать [curses] (http://en.wikipedia.org/wiki/Curses_%28programming_library%29), чтобы управлять всем этим для вас. – Celada

+0

Кстати, обычно 'c' никогда не будет равным' 3', потому что если использование нажимает Ctrl-C, тогда вы получите сигнал 'SIGINT'. – Celada

+2

Это более сложный вопрос, чем вы себе представляете ... созданный код зависит от типа терминала (а текстовая консоль, терминалы xterm, gnome или kde или командная строка Windows различны в этом аспекте), а также на консольном драйвере или в настройках клавиатуры X. Текстовый терминал Linux HOWTO, http://www.tldp.org/HOWTO/Text-Terminal-HOWTO.html дает некоторые отправные точки, особенно в разделе 6 (определенно используйте и следуйте ссылкам, представленным там). Если вы хотите сделать это способом _portable_ (без большого количества кода, зависящего от типа термина), используйте библиотеку, например 'ncurses'. –

ответ

5

Вы можете использовать рамки curses.

При использовании проклятий легко получить специальные нажатия клавиш. Но недостатком является то, что вы должны забрать всю библиотеку curses во время соединения (например, с gcc -lcurses), и вы должны использовать все функции curses внутри инициализированного экрана curses.

#include <stdio.h> 
#include <curses.h> 

int main() 
{ 
    int c = 0; 
    initscr(); 
    keypad(stdscr, 1); 
    c = getch(); 
    endwin(); 
    printf("0x%04x\n", c); 
    printf("0x%04x\n", KEY_HOME); 
} 

Это будет инициализировать стандартный экран (stdscr), включить цифровую клавиатуру в нем и получить ключ-отжимать с помощью Геч() и закройте stdscr снова retoring режимы терминала.

Вы также можете проверить, поддерживается ли специальная клавиша в вашем текущем терминале с помощью функции has_key().

Это простой способ ..

+0

Я ценю ответ, но, к сожалению, мне это нужно для встроенного устройства, а библиотека curses не доступны. – Akobold

+0

@Akobold: 'curses' - это бесплатное программное обеспечение, как и используемая им база данных terminfo. Какой из них вы используете, не имеет значения ни в каком другом месте, как «не изобретать колесо» ... –

+2

Я подразумеваю, что компиляция 'ncurses' для вашей встроенной среды, даже если это необходимо, сначала портирует ее, сэкономит ваше время. –

Смежные вопросы