Wie kann ich einen Schlüsselstrich sofort in Linux erfassen? [Duplikat]

7

Ich bin ein Neuling in Linux-Programmierung. : -)

Ich frage mich nur, ob mein Programm (unter Verwendung der C -Sprache) jeden einzelnen Tastenanschlag sofort in Linux erfassen kann und dann entscheiden kann, ob es echotiert oder nicht und wie es angezeigt wird, genau wie Telnet.

Wenn beispielsweise ein Benutzer "A" anschlägt, möchte ich, dass das Programm "B" anzeigt, wenn er "B", "C" usw. eingibt.

Es klingt lustig und nutzlos. Ich bin nur neugierig darauf.

    
Yishu Fang 03.10.2012, 14:25
quelle

4 Antworten

12

Grundsätzlich hängt es stark davon ab, wie Sie sofort definieren.

Hier gibt es zwei Aufgaben. Die erste besteht darin, das normale Schlüsselecho zu deaktivieren, das in den meisten C-Eingabebibliotheken enthalten ist. Die zweite besteht darin, das neue Zeichen anstelle des alten auszugeben.

Im Pseudocode.

%Vor%

Es gibt eine Reihe von Systemen, die kommunizieren, um einen Tastendruck zu erfassen.

  1. Die Tastatur
  2. (möglicherweise) ein USB-Bus
  3. Der CPU-Interrupt-Handler
  4. Das Betriebssystem
  5. Der X-Server-Prozess
  6. Das X "Fenster", das den Fokus hat.

Der letzte Schritt erfolgt mit einem Programm, das eine kontinuierliche Schleife ausführt, die Ereignisse vom X-Server erfasst und verarbeitet. Wenn Sie dieses Programm auf bestimmte Weise erweitern möchten (die Länge der Zeit, die die Taste gedrückt wurde), müssen Sie den anderen Programmen mitteilen, dass Sie "rohe" Tastaturereignisse haben wollen, was bedeutet, dass Sie nicht wirklich vollständig "gekocht" erhalten werden " Figuren. Als Ergebnis müssen Sie verfolgen, welche Tasten hoch und runter sind und wie lange, und mit all dem seltsamen Metaschlüsselverhalten in Ihrem Programm umgehen (das ist kein 'a', es ist ein 'A', weil shift ist nicht erreichbar, usw.).

Es gibt auch andere Verarbeitungsmodi, die berücksichtigt werden müssen, wie kanonisch und nicht-kanonisch, die steuern, ob die Ereignisse in zeilenorientierten Blöcken (Zeilenereignissen) oder zeichenorientierten Blöcken (Zeichenereignissen) empfangen werden sollen. Auch dies ist etwas kompliziert durch die Notwendigkeit, die Upstream-Programme auf die Anforderungen des Downstream-Clients aufmerksam zu machen.

Nun, da Sie eine Vorstellung von Ihrer Umgebung haben, sollten wir uns den tatsächlichen Code ansehen, der benötigt wird, um die Zeichenausgabe zu unterdrücken.

%Vor%

Auch das ist nicht unmittelbar. Um sofort zu kommen, müssen Sie näher an die Quelle kommen, was schließlich ein Kernel-Modul bedeutet (das immer noch nicht so direkt ist wie der Tastatur-Mikrocontroller, der nicht so unmittelbar ist wie der Moment, an dem der Schalter tatsächlich geschlossen wird). Wenn genügend Elemente zwischen Quelle und Ziel vorhanden sind, wird es möglich, den Unterschied zu erkennen. In der Praxis wurde dieser Code jedoch von vielen Leuten bearbeitet, die den besten Kompromiss zwischen Leistung und Flexibilität suchen.

    
Edwin Buck 03.10.2012, 14:51
quelle
5

Edwin Buck lieferte eine großartige Antwort. Hier ist eine andere Alternative, die ncurses verwendet, was solche Dinge ein bisschen einfacher macht und auf fast jeder Linux-Distribution und anderen Unix-Varianten unterstützt wird.

%Vor%

kompiliere mit gcc code.c -o code -lncurses

Und hier sind einige unterstützende Links:

ncurses noecho und andere - man-Seite
ncurses Programmierung HOWTO

    
Chimera 03.10.2012 16:46
quelle
4

Dieser Code kann im Internet gefunden werden und ist von kermi3 von c-board

%Vor%

BEARBEITEN: natürlich, dass, wenn Sie das Zeichen selbst und nicht den ASCII-Wert auf char anstelle von int

ändern möchten     
TheNewOne 03.10.2012 14:34
quelle
0

Es mag übertrieben sein, aber Sie können Spielebibliotheken wie sdl verwenden, um das zu erreichen.

    
none 03.10.2012 14:29
quelle

Tags und Links