Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Перехват нажатий клавиш в консоли (С++)  (Прочитано 2681 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн PashaWNN

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Нужно перехватывать нажатия клавиш в консоли, таких как стрелки и т.д.
Гугл даёт решения для VC++ и с использованием инклуда windows.h

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Перехват нажатий клавиш в консоли (С++)
« Ответ #1 : 03 Января 2016, 20:23:34 »
PashaWNN, getch?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

shura1

  • Гость
Re: Перехват нажатий клавиш в консоли (С++)
« Ответ #2 : 03 Января 2016, 20:33:42 »
Это сложно, и в общем случае, невозможно. Так нельзя перехватить в терминале нажатия Ctrl+Shift. Все потому, что "консоль" в Линуксе - это эмулятор реальных терминалов, которые в 60-70-80-90-х годах подключались к большим многопользовательским машинам - и которые могли передавать ограниченное количество символов (в 80-х ASCII стал стандартным набором - и в нем только 127 символов).

Для нажатия стрелки, к примеру передается несколько символов - в эмуляторе xterm нажатие клавишы стрелка влево кодируется тремя символами 0x1b, [ и D. В виртуальной консоли (куда попадаешь при нажатии Ctrl+Alt+F1) они могут кодироваться по другому (стрелки совпадают, а вот клавиша Home - нет).

Для работы с терминалом (клавишами, курсором) в Линуксе используется библиотека ncurses. Надо (если надо) копать в ту сторону.

Оффлайн PashaWNN

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Перехват нажатий клавиш в консоли (С++)
« Ответ #3 : 03 Января 2016, 20:35:44 »
а какой инклуд нужен для работы этой функции? в примерах видел windows.h, остальные пробовал, но чёт как-то не срослось
main.cpp:5:7: error: ‘getch’ was not declared in this scope

Пользователь решил продолжить мысль 03 Января 2016, 20:38:54:
Это сложно, и в общем случае, невозможно. Так нельзя перехватить в терминале нажатия Ctrl+Shift. Все потому, что "консоль" в Линуксе - это эмулятор реальных терминалов, которые в 60-70-80-90-х годах подключались к большим многопользовательским машинам - и которые могли передавать ограниченное количество символов (в 80-х ASCII стал стандартным набором - и в нем только 127 символов).

Для нажатия стрелки, к примеру передается несколько символов - в эмуляторе xterm нажатие клавишы стрелка влево кодируется тремя символами 0x1b, [ и D. В виртуальной консоли (куда попадаешь при нажатии Ctrl+Alt+F1) они могут кодироваться по другому (стрелки совпадают, а вот клавиша Home - нет).

Для работы с терминалом (клавишами, курсором) в Линуксе используется библиотека ncurses. Надо (если надо) копать в ту сторону.


Cпасибо за ответ. Это именно то, что нужно
« Последнее редактирование: 03 Января 2016, 20:38:54 от PashaWNN »

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5669
  • Все по палатам!
    • Просмотр профиля
Re: Перехват нажатий клавиш в консоли (С++)
« Ответ #4 : 03 Января 2016, 22:44:26 »
PashaWNN, посмотри вот такую игрушку для консоли
https://forum.ubuntu.ru/index.php?topic=255290.msg2022603#msg2022603
Извините, я все еще учусь

Оффлайн PashaWNN

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Перехват нажатий клавиш в консоли (С++)
« Ответ #5 : 04 Января 2016, 05:26:11 »
Есть проблема с распознаванием кодов клавиш-стрелок с помощью getch()
Использую свитч-кейс, при этом KEY_DOWN и KEY_LEFT работает, а KEY_RIGHT и KEY_UP
#include <ncurses.h>

int main() {
  initscr();
  while (true){
  printw("\n%d\n", getch());}
  endwin();
}
такой код после нажатия любой кнопки-стрелки выдаёт на экран
^[
27
[
91
A
65

отличается только последняя цифра у разных стрелок, а первые четыре строки одни и те же

shura1

  • Гость
Re: Перехват нажатий клавиш в консоли (С++)
« Ответ #6 : 04 Января 2016, 05:55:23 »
Если честно, то с гуем легче работать, чем с ncurses.  Незря так названа (curses - проклятия ;) )
Вот пара программ, разбери
http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/keys.html
http://www.paulgriffiths.net/program/c/curin1.php

(curses и ncurses на Линуксе - одно и то же)

Axa-Ru

  • Гость
Re: Перехват нажатий клавиш в консоли (С++)
« Ответ #7 : 04 Января 2016, 08:57:45 »
http://www.linuxquestions.org/questions/programming-9/detecting-arrow-key-presses-in-c-c-166055/
Здесь тоже с такой же задачкой люди заморочились.
Там два примера по считывания raw кодов. Один с ncurses, другой - без.

 

Страница сгенерирована за 0.145 секунд. Запросов: 26.