Подтвердить что ты не робот

Получение нажатий клавиш и событий выпуска ключей в приложениях терминала Linux?

Я хотел бы написать простую программу на C, которая будет выполнять различные действия, основанные на событиях "key down" и "key up". Эта программа будет запускаться из rxvt.

Какую библиотеку или механизм следует использовать для доступа к нажатию клавиш и выпусков? Правда ли, что чтение /dev/tty будет обеспечивать только ключевые релизы? Это также верно для termcap, terminfo, ncurses и slang? Есть ли способ достичь этого из терминального приложения?

4b9b3361

Ответ 1

Следующие ссылки могут оказать некоторую помощь в использовании режима сырой клавиатуры, который даст вам доступ к событиям клавиатуры, а не только к выпуску ключей.

  • Этот журнал Linux article
  • Этот article на SourceForge
  • И это HOWTO, когда все идет плохо.

Необработанный режим имеет тот недостаток, что вам нужно сделать свое собственное преобразование из кодов сканирования в символы.

Ответ 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)