2016-11-02 11 views
-2

Моя проблема в том, что я хочу сделать что-то особенное, когда мой пользователь нажимает табуляцию в терминале. Мой первый код объясняет, что:Как использовать функции клавиатуры с _getch(), как это возможно с getline()?

char buffer[100]; 

while (true) 
{ 
    std::cin.getline(buffer, 100); // do IMMEDIATELY something if 'tabulation' was used ? 

} 

Итак, я спросил себя, как проверить все символы? Я пробовал с _getch();

while (true) 
{ 
    c = _getch(); 

    if (c == '\t') 
     // do something special 
    else 
     std::cout << (char)c; 
} 

Но теперь, я не могу использовать любые фирменные блюда в функциональные клавиши, как стрелки, Delaware, suppr и т.д ... Я не могу двигаться в то, что я набрав, как я могу с getline()

Итак, есть ли какие-либо решения для специального прерывания в середине getline()? Или можно использовать _getch() по-другому? Я также попытался сделать другой поток (один с getline(), а другой с _getch() для проверки каждого), но я не уверен в том, что я могу делать с потоками.

Можно вручную обрабатывать каждую специальную функцию (клавиши со стрелками, del, suppr и т. Д.) Вручную, но я ищу другое решение.

+0

Нет, нет стандартного C++. Это операционная система и терминал. –

+0

Почему вы не используете stdin или scanf? – Gugg

+1

Вы прочитали часть документации, которая объясняет, что значения '_getch' могут вернуться? Знаете ли вы, что вам может потребоваться дважды вызывать '_getch', чтобы получить один ключевой код? –

ответ

0

Предполагая, что вы имеете в виду _getch() функции из библиотеки времени выполнения Microsoft C:

_getch и _getwch функции чтения одного символа из консоли без вторя характер. Ни одна из этих функций не может быть используется для чтения CTRL + C. При чтении функциональной клавиши или клавиши со стрелкой каждая функция должна вызываться дважды; первый вызов возвращает 0 или 0xE0, а второй вызов возвращает фактический код ключа.

Таким образом, если _getch() возвращает либо 0 или 0xE0 (224), вы должны вызвать функцию снова, чтобы увидеть, какие именно клавиша была нажата.

По крайней мере, на моей машине, эти «расширенные» коды символов следующим образом (в десятичной системе):

  • -59 = F1
  • -60 = F2
  • -61 = F3
  • -62 = F4
  • -63 = F5
  • -64 = F6
  • -65 = F7
  • -66 = F8
  • -67 = F9
  • -68 = F10
  • 224 71 = Главная
  • 224 72 = ↑ (стрелка вверх)
  • 224 73 = Page Up
  • 224 75 = ← (стрелка влево)
  • 224 77 = → (стрелка вправо)
  • 224 79 = Конец
  • 224 80 = ↓ (стрелка вниз)
  • 224 81 = Page Down
  • 224 82 = Вставка
  • 224 83 = Удалить
  • 224 133 = F11
  • 224 134 = F12

Что касается do с этими кодами, посмотрите на SetConsoleCursorPosition и связанные с ним функции API-интерфейса консоли.

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

  • Нет связанных вопросов^_^