Получение нажатий клавиш и событий выпуска ключей в приложениях терминала Linux?
Я хотел бы написать простую программу на C, которая будет выполнять различные действия, основанные на событиях "key down" и "key up". Эта программа будет запускаться из rxvt.
Какую библиотеку или механизм следует использовать для доступа к нажатию клавиш и выпусков? Правда ли, что чтение /dev/tty
будет обеспечивать только ключевые релизы? Это также верно для termcap, terminfo, ncurses и slang? Есть ли способ достичь этого из терминального приложения?
Ответы
Ответ 1
Следующие ссылки могут оказать некоторую помощь в использовании режима сырой клавиатуры, который даст вам доступ к событиям клавиатуры, а не только к выпуску ключей.
Необработанный режим имеет тот недостаток, что вам нужно сделать свое собственное преобразование из кодов сканирования в символы.
Ответ 2
Это не будет работать в общем случае. Терминалы ANSI (из которых все эмуляторы спускаются) представляют собой только ключевые "прессовые" события. Они не записывают события независимо друг от друга.
Если вам нужен доступ к клавиатуре с низким уровнем, правильная среда - это действительно графическая программа. Даже веб-приложение будет иметь более чистый доступ к ключевым событиям, чем терминал.
Ответ 3
Я не думаю, что нкурсы будут работать. Ссылка Basilevs сообщила о клавише "стрелка вверх" и клавише "стрелка вниз", а не нажатии и отпускании клавиш.
Ответ 4
Это нужно запустить как root: (Внимание, это общесистемный кейлоггер)
#!/usr/bin/python3
import signal
import keyboard
import time
import os
if not os.geteuid() == 0:
print("This script needs to be run as root.")
exit()
def exitNice(signum, frame):
global running
running = False
def keyEvent(e):
global running
if e.event_type == "up":
print("Key up: " + str(e.name))
if e.event_type == "down":
print("Key down: " + str(e.name))
if e.name == "q":
exitNice("", "")
print("Quitting")
running = True
signal.signal(signal.SIGINT, exitNice)
keyboard.hook(keyEvent)
print("Press 'q' to quit")
fps = 1/24
while running:
time.sleep(fps)