Wenn Sie Linux verwenden, können Sie Eingabegeräte am besten mithilfe der Linux-Ereignisschnittstelle unterscheiden. Nachdem die hardwarespezifischen Eingaben eines Geräts dekodiert wurden, werden sie in eine Linux-spezifische Zwischenereignisstruktur konvertiert und verfügbar gemacht, indem eines oder mehrere der Zeichengeräte unter /dev/input/
gelesen werden . Dies ist übrigens völlig unabhängig von der verwendeten Programmiersprache.
Jedes Hardwaregerät bekommt seinen eigenen /dev/input/eventX
Gerät, und es gibt auch Aggregate (z.B. /dev/input/mice
die die Bewegung aller Mäuse im System darstellt). Ihr System kann auch /dev/input/by-path
haben und /dev/input/by-id
.
Da ist ein ioctl
genannt EVIOCGNAME
die den Namen des Geräts als lesbare Zeichenfolge zurückgibt, oder Sie können etwas wie /dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse
verwenden .
Sie öffnen das Gerät und jedes Mal, wenn ein Ereignis von der Eingabehardware eintrifft, erhalten Sie ein Datenpaket. Wenn Sie C lesen können, können Sie die Datei /usr/include/linux/input.h
studieren das zeigt genau, wie dieses Zeug funktioniert. Wenn nicht, können Sie diese Frage lesen, die alle Informationen enthält, die Sie benötigen.
Das Gute an der Ereignisschnittstelle ist, dass Sie einfach herausfinden, welches Gerät Sie benötigen, und Eingaben von diesem Eingabegerät nur lesen können , alle anderen ignorierend. Sie erhalten auch Benachrichtigungen über Tasten, Schaltflächen und Steuerelemente, die Sie normalerweise nicht erhalten, wenn Sie einfach den „gekochten“ Zeichenstrom von einem Terminal lesen:sogar tote Tasten wie Shift usw.
Das Schlimme ist, dass die Ereignisschnittstelle keine "gekochten" Zeichen zurückgibt, sondern nur numerische Codes für Tasten verwendet (die Codes, die jeder Taste entsprechen, finden sich in der oben genannten Header-Datei — aber auch in der Python-Quelle von event.py. Wenn Ihr Eingabegerät ungewöhnliche Tasten/Schaltflächen hat, müssen Sie möglicherweise ein wenig experimentieren, bis Sie die richtigen Zahlen erhalten.
Ein alternativer Ansatz (wenn Ihre "Tastatur" nicht viele Tasten hat - viele Geräte geben vor, Tastaturen zu sein) besteht darin, eine Tastenbelegung speziell auf jede Tastatur anzuwenden und sicherzustellen, dass die Tasten unterschieden werden.
Dies wird hier beschrieben:https://superuser.com/questions/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only. Der Hauptpunkt ist die setxkbmap
nimmt ein Geräteargument.
Wenn Sie den Raw-Input-Ansatz verwenden, findet lsinput Ihr Raw-Gerät für Sie.