Как отследить нажатие клавиши c
Перейти к содержимому

Как отследить нажатие клавиши c

  • автор:

Как считывать нажатие клавиши без задержек?

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

Пробовал сделать неблокирующий getch() с помощью

nodelay(stdscr, TRUE); 

и обрабатывать ERR в цикле, эффект остаётся.

Как проверить нажатие клавиши-модификатора (Windows Forms .NET)

Когда пользователь нажимает клавиши в приложении, можно отслеживать нажатия клавиш-модификаторов, таких как SHIFT , ALT и CTRL . При нажатии клавиши-модификатора в сочетании с другими клавишами или даже при щелчке мышью приложение может реагировать соответствующим образом. Например, нажатие клавиши S может привести к отображению «S» на экране. Если нажать клавиши CTRL+S , можно сохранить текущий документ.

Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.

При обработке события KeyDown свойство KeyEventArgs.Modifiers, полученное обработчиком событий, указывает, какие клавиши-модификатора нажаты. Кроме того, свойство KeyEventArgs.KeyData указывает символ, который был нажат вместе с любыми клавишами-модификаторами в сочетании с побитовым оператором «ИЛИ».

Если вы обрабатываете событие KeyPress или событие мыши, обработчик событий не получает эти сведения. Используйте свойство ModifierKeys класса Control для обнаружения клавиши-модификатора. В любом случае необходимо выполнить побитовый оператор «И» для соответствующего значения Keys и проверяемого значения. Перечисление Keys предлагает различные варианты для каждой клавиши-модификатора, поэтому важно выполнить проверку побитового оператора «И» на предмет наличия правильного значения.

Например, клавиша SHIFT представлена следующими значениями:

Правильное значение для проверки SHIFT в качестве клавиши-модификатора — Keys.Shift. Аналогичным образом, для проверки CTRL и ALT в качестве модификаторов следует использовать значения Keys.Control и Keys.Alt соответственно.

Определение клавиши-модификатора

Определите, нажата ли клавиша-модификатор, сравнив свойство ModifierKeys и значение перечисления Keys с побитовым оператором «И».

В следующем примере кода показано, как определить, нажата ли клавиша SHIFT в обработчиках событий KeyPress и KeyDown.

// Event only raised when non-modifier key is pressed private void textBox1_KeyPress(object sender, KeyPressEventArgs e) < if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) MessageBox.Show("KeyPress " + Keys.Shift); >// Event raised as soon as shift is pressed private void textBox1_KeyDown(object sender, KeyEventArgs e)
' Event only raised when non-modifier key is pressed Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) If ((Control.ModifierKeys And Keys.Shift) = Keys.Shift) Then MessageBox.Show("KeyPress " & [Enum].GetName(GetType(Keys), Keys.Shift)) End If End Sub ' Event raised as soon as shift is pressed Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) If ((Control.ModifierKeys And Keys.Shift) = Keys.Shift) Then MessageBox.Show("KeyPress " & [Enum].GetName(GetType(Keys), Keys.Shift)) End If End Sub 

См. также

  • Общие сведения об использовании клавиатуры (Windows Forms .NET)
  • Использование событий клавиатуры (Windows Forms .NET)
  • Keys
  • ModifierKeys
  • KeyDown
  • KeyPress

Совместная работа с нами на GitHub

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

Можно ли отслеживать нажатия клавиш?

Есть ли способ отследить ряд нажатий клавиш на сайте? Чтобы, допустим, при последовательном нажатии клавиш «t»»e»»s»»t» начиналось выполнение функции.

  • Вопрос задан более трёх лет назад
  • 850 просмотров

Комментировать

Решения вопроса 1

Пример кода, который выведет в консоли «Congratulations!» после последовательного нажатия клавиш «t», «e», «s», «t»

document.addEventListener('keydown', function(e) < KEY = ["t", "e", "s", "t"]; this.INPUT = this.INPUT || []; this.INPUT.push(e.key); if (this.INPUT.some((e, i) =>KEY[i] != e)) this.INPUT = [this.INPUT.pop()]; else if (this.INPUT.length == KEY.length) < console.log("Congratulations!"); this.INPUT = []; >>)

Ответ написан более трёх лет назад

Нравится 3 1 комментарий

unixforum.org

как на Си реализовать обработчик нажатия клавиш (как на Си реализовать обработчик нажатия клавиш)

v4567 Сообщения: 162 ОС: Devuan

как на Си реализовать обработчик нажатия клавиш

Сообщение v4567 » 15.07.2015 14:48

Подскажите или натолкните на мысль, или на какой нибудь нормальный материал по данному вопросу.
Необходимо в виде линуксовой библиотеки написанной строго на Си (именно на Си не на Си++) реализовать обработчик нажатия клавиш. Что бы при помощи библиотеки можно было отловить нажатия некоторых клавиш.
За помощь заранее благодарен!

Спасибо сказали:
Bizdelnick Модератор Сообщения: 20693 Статус: 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 Модератор Сообщения: 20693 Статус: 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 Модератор Сообщения: 20693 Статус: 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 Модератор Сообщения: 20693 Статус: 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 Модератор Сообщения: 20693 Статус: 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 Модератор Сообщения: 20693 Статус: 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 второй терминал. К. О.
Пишите правильно:

в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *