Считывание нажатия клавиш с клавиатуры
Считывание нажатия комбинации клавиш
Суть такова, что не понимаю как отследить нажатие нескольких клавиш одновременно. Именно, нужно.
Как создать сообщение нажатия клавиш клавиатуры?
Мне надо что бы при каждом нажатии на клавишу клавиатуры у меня выполнялись определенные.

Имитация нажатия клавиш клавиатуры
Нужно сделать приложение эмуляции нажатия клавиш в любой программе, являющейся активной. Искал в.
Обработка нажатия клавиш клавиатуры в программе на C++
Здравствуйте, уважаемые форумчане и великие гуру! У меня есть такой вопрос: Как можно.
![]()
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
Смотря как вам нужно. Но например так.
1 2 3 4 5
char ch; std::cout"Enter q for exit\n"; std::cin>>ch; if(ch=='q') return 0;
ЧакЭ одобряЭ
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
например стрелки вверх-вниз
просто надо сделать консольное меню похожее на кнопочное
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
Вот так будет работать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include #include using namespace std; int main() { char ch; int code; while(1) { ch = getch(); code = static_castint>(ch); if(ch == 27) // если клавиша esc exit(0); } }
Добавлено через 4 минуты
80 — кнопка навэрх
72 — кнопка вныз
или наоборот
![]()
2890 / 1825 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
NikolaWhite, а почему именно 27 ето — Esc ?
![]()
5041 / 2620 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1

Сообщение было отмечено как решение
Решение
Asics^, изучайте таблицы http://ascii-table.com/ascii.php
именно почему так, это наверное надо спрашивать у создателей ASCII
Регистрация: 15.01.2010
Сообщений: 144
Сообщение от Asics^ 
NikolaWhite, а почему именно 27 ето — Esc ?
потому что енто ее код. погугли там есть коды до каждой кнопки на клаве
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
а почему именно 27 ето — Esc ?
Потому что это код клавиши ANSСII
У каждой клавиши есть свой код ввиде числа
![]()
2890 / 1825 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
Списибо,буду учить.
Регистрация: 17.06.2010
Сообщений: 38
Люди, а как вы делаете считывание клавишь вверх, вниз, влево. вправо, ведь getch() у всех этих клавишь выдает код 224. Лично я сделал так, что если клавиши 224 то снова поисходит getch(). Но может быть можно по другому?
Кстати не обязательно изучать таблицы где-то в интернетах, можно просто посмотреть коды с помошью дебага или сделать вывод кода клавишь на экран.
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
как вы делаете считывание клавишь вверх, вниз, влево. вправо, ведь getch() у всех этих клавишь выдает код 224.
Непонятно откуда у тебя берется 224, должно быть 77, 75, 80, 72
Кстати не обязательно изучать таблицы где-то в интернетах, можно просто посмотреть коды с помошью дебага или сделать вывод кода клавишь на экран.
а поподробнее можно? (Если это касается VS Express)
![]()
2890 / 1825 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
NikolaWhite, ну примерно вот так:
1 2 3 4 5 6 7 8 9 10
#include #include int main() { char k; std::cin >> k; std::cout int(k) std::endl; getch(); return 0; }
Регистрация: 17.06.2010
Сообщений: 38
Ну сначала
key = getch();
, а дальше либо смотрим переменную key дебагом либо:
printf("%f", key)
как-то так. Дак вот если нажать вниз или вверх и т.д. то выдаст 224.
![]()
5041 / 2620 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
Сообщение от NikolaWhite 
Кстати не обязательно изучать таблицы где-то в интернетах
имхо, куда удобнее иметь под рукой таблицу, чем постоянно писать для этого отдельную прогу.
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
Сообщение от NikolaWhite
Кстати не обязательно изучать таблицы где-то в интернетах
Это не от NikolaWhite сообщение. Лично я уже добавил таблицу в избранное
Сообщение от NikolaWhite 
Это не от NikolaWhite сообщение. Лично я уже добавил таблицу в избранное
да просто из твоего сообщения копировать было удобнее 🙂
| Меню пользователя @ fasked |
| Читать блог |
Регистрация: 14.01.2016
Сообщений: 50
1 2 3 4 5 6
while(true){ if(_getch()== 27){ cout"Dosvidos"; exit(0); } }
Регистрация: 07.02.2018
Сообщений: 3
А если вилазит такая хрень??
Ошибка C4996 ‘getch’: The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _getch. See online help for details. Project58 c:\users\діма\source\repos\project58\project58\source.cpp 12
Добавлено через 1 минуту
Все ненеадо надо было просто заменить на _getch;
Регистрация: 22.03.2017
Сообщений: 6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
#include "conio.h" #include "windows.h" #include using namespace std; void StartMenu(int switcher) { system("cls"); switch (switcher) { case 1: cout "\n\n\n >\n\n ПОМОЩЬ\n\n ЗАЛ СЛАВЫ\n\n ВЫХОД "; break; case 2: cout "\n\n\n ИГРАТЬ \n\n >\n\n ЗАЛ СЛАВЫ\n\n ВЫХОД "; break; case 3: cout "\n\n\n ИГРАТЬ \n\n ПОМОЩЬ\n\n >\n\n ВЫХОД "; break; case 4: cout "\n\n\n ИГРАТЬ \n\n ПОМОЩЬ\n\n ЗАЛ СЛАВЫ\n\n >"; break; } int choice = _getch(); if (choice == 224) choice = _getch(); //cout if (choice == 80) if (switcher != 4) StartMenu(switcher + 1); else StartMenu(1); if (choice == 72) if (switcher != 1) StartMenu(switcher - 1); else StartMenu(4); if (choice == 13 || choice == 32) { if (switcher == 1) { system("cls"); cout "1" endl; } if (switcher == 2) { system("cls"); cout "2" endl; } if (switcher == 3) { system("cls"); cout "3" endl; } if (switcher == 4) { system("cls"); cout "4" endl; } } } int main() { setlocale(LC_ALL, "Rus");//задание кодировки system("mode con cols=51 lines=14");//задание размеров окна консоли system("title Space Invader");//задание описания окна консоли system("color 0A");//задание цвета консоли (0-задний фон; А-передний фон) HANDLE hCons = GetStdHandle(STD_OUTPUT_HANDLE);//получение хендла CONSOLE_CURSOR_INFO cursor = { 100, false };//число от 1 до 100 размер курсора в процентах; false\true - видимость SetConsoleCursorInfo(hCons, &cursor);//применение заданных параметров курсора StartMenu(3); system("pause >> void"); return 0; }
unixforum.org
как на Си реализовать обработчик нажатия клавиш (как на Си реализовать обработчик нажатия клавиш)
v4567 Сообщения: 162 ОС: Devuan
как на Си реализовать обработчик нажатия клавиш
Сообщение v4567 » 15.07.2015 14:48
Подскажите или натолкните на мысль, или на какой нибудь нормальный материал по данному вопросу.
Необходимо в виде линуксовой библиотеки написанной строго на Си (именно на Си не на Си++) реализовать обработчик нажатия клавиш. Что бы при помощи библиотеки можно было отловить нажатия некоторых клавиш.
За помощь заранее благодарен!
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20512 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение Bizdelnick » 15.07.2015 14:58
В иксах или в консоли?
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
v4567 Сообщения: 162 ОС: Devuan
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение v4567 » 15.07.2015 15:11
Запускается некоторая программа, которая написана не на Си и не на Си++ эта программа может вызывать библиотеки написанные на Си и использовать их.
Программа запускается в эмуляторе консоли — konsole она так же использует библиотеку ncurses.
Отвечая на Ваш вопрос — получается что в иксах.
Спасибо сказали:
v4567 Сообщения: 162 ОС: Devuan
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение v4567 » 15.07.2015 15:17
В самой программе конечно можно реализовать ввод с клавиатуры, но он реализован не очень хорошо.
Есть функция которая при запуске ждёт ввода, при этом вся программа то же стоит и ждёт ввода.
Мне же нужно реализовать обработку прерываний от клавиатуры, потому что я не знаю в какой именно момент выполнения программы будет нажата какая нибудь клавиша. В самом языке нету функций для работы с прерываниями. Если интересно что за язык — язык интерпретируемый mumps — gt.m
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20512 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение Bizdelnick » 15.07.2015 15:31
15.07.2015 15:11
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
v4567 Сообщения: 162 ОС: Devuan
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение v4567 » 15.07.2015 15:36
Не используя ncurses никак не получится?
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20512 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение Bizdelnick » 15.07.2015 15:40
Получится, но будет значительно сложнее. Фактически надо будет сделать свою реализацию того же самого. Какой смысл?
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
v4567 Сообщения: 162 ОС: Devuan
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение v4567 » 15.07.2015 15:43
Может можно при помощи системных вызовов ядра как то реализовать?
>> Получится, но будет значительно сложнее.
в двух словах хотя бы подскажите как
буду смотреть в сторону ncurses
Спасибо за помощь!
Спасибо сказали:
v4567 Сообщения: 162 ОС: Devuan
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение v4567 » 15.07.2015 16:09
Мне надо по сути делать обработку прерывания от клавиатуры.
То есть не так что программа остановилась и ждёт ввода. Насколько я понял getch работает именно так, или я ошибаюсь?
Спасибо сказали:
eddy Сообщения: 3321 Статус: Красный глаз тролля ОС: ArchLinux Контактная информация:
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение eddy » 15.07.2015 16:33
Да элементарно это делается: мой велосипед, например.
RTFM
——-
KOI8-R — патриотичная кодировка
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20512 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение Bizdelnick » 15.07.2015 16:40
15.07.2015 16:09
То есть не так что программа остановилась и ждёт ввода. Насколько я понял getch работает именно так, или я ошибаюсь?
(getch(3)) писал(а):
The getch, wgetch, mvgetch and mvwgetch, routines read a character from the window. In no-delay mode, if no input is waiting, the value ERR is returned. In delay mode, the program waits until the system passes text through to the program.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
s.xbatob Сообщения: 1139 ОС: Fedora
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение s.xbatob » 15.07.2015 17:01
Вы свои требования высказали достаточно невразумительно. Но в любом случае это сложнее, чем кажется. Самое простое и близкое к тому, что вы написали — написать простое графическое приложение, в котором обрабатывать KeyPressEvent и KeyReleaseEvent. Если же вам нужно обрабатывать нажатие клавиши в «традиционном стиле» — как пришедший символ от терминала, то тут достаточно установить режим cbreak (что getch наверное и делает)
Но если вам надо одновременно ждать эти нажатия и делать что-либо ещё (или вообще делать несколько дел одновременно) — то это уже совсем другая задача. Тут надо либо разбиваться на потоки, либо организовывать свою задачу как управляемую событиями (а лучше — и то, и другое) Она не имеет прямого отношения ни к интерфейсу к системе, ни к языку программирования.
P.S. Ну и запускать в графической среде эмулятор символьного терминала, а в нём псевдографическое приложение — это извращение.
Спасибо сказали:
yars Сообщения: 1144 Статус: Slacker! ОС: Slackware64-current
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение yars » 15.07.2015 18:54
P.S. . извращение
А мне что делать, если я в эмуляторе терминала запускаю консольный mc? Бежать на графический ФМ? Нафига? И что с того, что он псевдографический?
Slackware64-current/Xfce 4.12/Acer TravelMate 5760
————-
Registered Linux User #557010
Спасибо сказали:
s.xbatob Сообщения: 1139 ОС: Fedora
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение s.xbatob » 15.07.2015 22:23
15.07.2015 18:54
P.S. . извращение
А мне что делать, если я в эмуляторе терминала запускаю консольный mc? Бежать на графический ФМ? Нафига? И что с того, что он псевдографический?
Да, вы поняли всё правильно!
Спасибо сказали:
yoshakar Сообщения: 259 ОС: Debian Stretch
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение yoshakar » 16.07.2015 00:04
То есть, по-вашему, каждый раз при запуске псевдографического приложения надо обязательно переключаться в тру-консоль? Это хуже чем извращение, это просто идиотизм.
Или вообще не пользоваться псевдографическими приложениями? Иметь две программы — одна псевдографическая, полнофункциональная и удобная, с красивыйм и продуманным интерфейсом, и вторая — с урезанным функционалом, кривая, страшная и глючна — и пользоваться при этом именно последней — опять же идиотизм чистой воды.
Спасибо сказали:
s.xbatob Сообщения: 1139 ОС: Fedora
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение s.xbatob » 16.07.2015 09:29
Повторяю для непонятливых: запускать в графической среде эмулятор символьного терминала, а в нём псевдографическое приложение — это извращение.
И прошу не искажать и не фантазировать на эту тему.
И состояние и темпы развития многочисленных графических библиотек и когда-то не менее многочисленных, но давно вымерших, псевдографических — это подтверждает.
Только мы отвлеклись.
Спасибо сказали:
eddy Сообщения: 3321 Статус: Красный глаз тролля ОС: ArchLinux Контактная информация:
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение eddy » 16.07.2015 11:18
16.07.2015 09:29
запускать в графической среде эмулятор символьного терминала, а в нём псевдографическое приложение — это извращение.
Говорить такое — вот истинное извращение!
Про mc пример был правильный. В линуксе нет (и, наверное, не будет — т.к. не надо, ведь есть mc!) ни одного хотя бы отдаленно напоминающего mc графического ФМ. Вот, скажем, у меня на работе на основном мониторе обычно geany с кодом открыт, а на дополнительном — xfce4-terminal с запущенным там mc. В geany код правлю, в mc по ФС навигацию осуществляю, а также запускаю make и т.п.
RTFM
——-
KOI8-R — патриотичная кодировка
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20512 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение Bizdelnick » 16.07.2015 12:06
i Уведомление от модератора Давайте не отвлекаться от темы, мы всё-таки в техническом разделе.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
eddy Сообщения: 3321 Статус: Красный глаз тролля ОС: ArchLinux Контактная информация:
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение eddy » 16.07.2015 13:57
Дык, по теме все уже сказали: select — чтобы узнать, не было ли активности; ~(ICANON | ECHO) — чтобы не было «эха».
RTFM
——-
KOI8-R — патриотичная кодировка
Спасибо сказали:
sabir Сообщения: 66 ОС: OpenBSD
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение sabir » 18.07.2015 14:06
15.07.2015 15:43
Может можно при помощи системных вызовов ядра как то реализовать?
#include #include #include #include #include #define EV_PRESSED 1 int quit = 0; int keyboard; int init_keyboard() < char *device = "/dev/input/event10"; if((getuid()) != 0) < printf("You are not root! This may not work. \n"); return -1; >if((keyboard = open(device, O_RDONLY)) == -1) < printf("%s is not a vaild device.\n", device); return -1; >return 0; > void * update_keyboard() < struct input_event event; while(1) < read(keyboard, &event, sizeof(struct input_event)); if(event.type == EV_KEY) < if(event.value == EV_PRESSED) < if(event.code == KEY_ESC) quit = 1; >> > > int main() < if(init_keyboard() != 0) return -1; pthread_t thread; int int result = 0; result = pthread_create(&thread, NULL, update_keyboard, &id); if(result != 0) < printf("Create thread failed\n"); return -1; >while(!quit) < // тута выполняется страшно важная и полезная работа >return 0; >
Обработчик клавиатуры запускается в отдельном процессе, не мешая работе основной программы. pthread_create — богомерзкая обертка над православным clone(), так же можно заюзать православный fork()
Код ожидает нажатия кнопки ‘ESC’, в качестве примера.
Работает только если есть права root или если поменять владельца «/dev/input/event10», где ‘event10’ клавиатура
Спасибо сказали:
yoshakar Сообщения: 259 ОС: Debian Stretch
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение yoshakar » 18.07.2015 14:17
18.07.2015 14:06
Обработчик клавиатуры запускается в отдельном процессе
Таки всё-таки в отдельном треде, а не процессе. Вот если заюзать fork() — то будет в отдельном процессе. Кстати, задавшись вопросом, можно ли сделать по-номальному, без лишним тредов и процессов, можно на этом примере изучить тему «asynchronous I/O в Linux».
Спасибо сказали:
sabir Сообщения: 66 ОС: OpenBSD
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение sabir » 18.07.2015 14:36
18.07.2015 14:17
18.07.2015 14:06
Обработчик клавиатуры запускается в отдельном процессе
Таки всё-таки в отдельном треде, а не процессе. Вот если заюзать fork() — то будет в отдельном процессе.
С чисто юридической точки зрения, таки да в отдельном треде/нити, ну а ежели по простому, по рабоче-крестьянски, то на этом форуме едва ли найдется пара-тройка людей, которые действительно понимают и смогут доходчиво объяснить другим, чем тред отличается от процесса, я имею ввиду на ядерном уровне, я например не понимаю.
18.07.2015 14:17
Кстати, задавшись вопросом, можно ли сделать по-номальному, без лишним тредов и процессов, можно на этом примере изучить тему «asynchronous I/O в Linux»
Ну почему же нельзя, можно и в главном цикле обрабатывать, без clone() и fork() -ов всяких, но тогда теряется быстрая реакция на событие, т.е. если главный цикл большой и выполняется относительно долгое время или ожидает ввода/вывода, а реакция на нажатие кнопки нужна прямо сейчас, то форкнуть обработчик в отдельный процесс, на мой личный взгляд, совсем не лишнее. Впрочем, как и весь кодинг, все зависит от кодера и его убеждений.
Спасибо сказали:
yoshakar Сообщения: 259 ОС: Debian Stretch
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение yoshakar » 18.07.2015 16:29
18.07.2015 14:36
чем тред отличается от процесса, я имею ввиду на ядерном уровне
Зачем же на ядерном? Можно и попроще для начала: у тредов память общая, а у процесов — нет. То есть чтобы передать данные из одного треда в другой (например, передать код нажатой клавши в цикл, делающий «страшно важную работу») достаточно объявить статическую переменную. А из процесса в процесс — придётся устраивать специальный канал общения. Есть и ещё разница, но это самое главное.
18.07.2015 14:36
Ну почему же нельзя, можно и в главном цикле обрабатывать, без clone() и fork() -ов всяких, но тогда теряется быстрая реакция на событие
Да, и так можно, но я говорил именно об асинхронном вводе-выводе, то есть и без тредов/процессов и без задержек обработки.
Спасибо сказали:
v4567 Сообщения: 162 ОС: Devuan
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение v4567 » 19.07.2015 19:36
Всем огромное спасибо за помощь.
А особенно спасибо Bizdelnick и sabir !!
Да, и так можно, но я говорил именно об асинхронном вводе-выводе, то есть и без тредов/процессов и без задержек обработки.
Может получиться, но надо выискивать где в программе во время выполнения вставлять обработчик нажатия клавиш — но это не правильно. Может получиться так что клавиша будет нажата когда выполняется не обработчик нажатия клавиш и тогда получится так что программа не выполнит то что должна выполнить после нажатия определённой клавиши.
На ассемблере это реализуется очень просто при помощи обработки прерываний. Кусок кода который должен обрабатывать прерывание от клавиатуры просто загрузился в озу и не выполняется, а выполняться начнёт когда сработает прерывание от клавиатуры.
Подскажите пожалуйста ещё вот что.
Как программно реализовать (в linux) переключение в буквенно-цифровой (25×80) режим из графики и обратно, если сценарии инициализации системы — SysV init scripts, а в inittab прописан только один терминал, в котором грузится графика и по Ctrl+Alt+F* в другие терминалы не переключиться.
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20512 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: как на Си реализовать обработчик нажатия клавиш
Сообщение Bizdelnick » 19.07.2015 21:02
19.07.2015 19:36
Кусок кода который должен обрабатывать прерывание от клавиатуры просто загрузился в озу и не выполняется, а выполняться начнёт когда сработает прерывание от клавиатуры.
Ну так Вы ж не в DOS’е вроде бы работаете. В нормальных системах прерывания обрабатывает ядро, а не прикладные программы.
19.07.2015 19:36
Как программно реализовать (в linux) переключение в буквенно-цифровой (25×80) режим из графики и обратно, если сценарии инициализации системы — SysV init scripts, а в inittab прописан только один терминал, в котором грузится графика и по Ctrl+Alt+F* в другие терминалы не переключиться.
Пропишите в inittab второй терминал. К. О.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Как считывать нажатие клавиши без задержек?
который печатает символы, вводимые с клавиатуры. Если зажать какую-нибудь клавишу, то сперва выведется один символ, затем, через некоторый промежуток времени будут выводиться остальные пока клавиша зажата. Как можно избавиться от вышеупомянутой паузы? Вручную опрашивать клавиатуру каким-либо образом?
Пробовал сделать неблокирующий getch() с помощью
nodelay(stdscr, TRUE);
и обрабатывать ERR в цикле, эффект остаётся.
Обработка нажатия клавиш
Есть идея написать код С++ который обрабатывал нажатие клавиши так сказать в реальном времени. То есть кнопка нажата выполнилось действие, отпустил эту же кнопку выполнилось другое действие ? Эксперименты с !kbhit() желаемого результата не дают. Работаю в консоли.
#include #include using namespace std; int main() < setlocale ( 0, "" ); while ( true ) < if ( kbhit() ) < cout else < cout Sleep ( 250 ); > return 0; >
Да да отлично я его не много дополнил, идеально то что хотел. Спасибо )
введите код здесь int main()
Sleep ( 250 ); system("cls"); > return 0;
porshe, так будет почище:
#include #include using namespace std; int main() < setlocale ( 0, "" ); int button; while ( true ) < if ( kbhit() ) < button = getch(); cout else < cout Sleep ( 250 ); > return 0; >
Cranium, да будет, но не всегда. Если нажата клавиша с дополнительным кодом? Тогда лучше так:
else < extentent = getch(); cout >
Хотя точно не знаю. Ваш код обрабатывает нажатия клавиш с расширенным кодом, но не сохраняет их в памяти( или сохраняет, но я не понимаю как? ).
Ещё есть странность. Без очистки буфера клавиатуры ( цикл while ). У меня код не работал, даже если я вставлял два gethc ‘a.
Так лучше, но не всегда )) Условие будет чуть сложнее.
The _getch and_getwch functions read a single character from the console without echoing the character. None of these functions can be used to read CTRL+C. When reading a function key or an arrow key, each function must be called twice; the first call returns 0 or 0xE0, and the second call returns the actual key code.