www.mikrocontroller.net

Forum: PC-Programmierung C, Linux: Tastatur-Puffer abfragen?


Autor: tipper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich in meiner Konsolenanwendung feststellen, ob (eine) Taste(n)
gedrückt wurde(n)?

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte kbhit() im Sinn, aber das schein unter UNIX nicht zu gehen:

http://www.ohse.de/uwe/articles/kbhit.html

Autor: tipper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Möglicherweise ist getch() die Lösung, aber die Funktion kommt wohl
Ursprünglich vom DOS..? Vielleicht habe ich ja Glück..

Hier mal ein Link:

http://www.pronix.de/pronix-783.html

Autor: SiO2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
getch() aus der ncurses lib.

Autor: tipper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Warum benötigt

  printw("Press any key to end program\n");

  nodelay(stdscr, FALSE);
  getch();
  endwin();

  printf("Program successfully terminated. Thank you.\n\n");

  return EXIT_SUCCESS;
}

3 Zeichen, um zu funktionieren? Die beiden letzten sind dann noch auf
der Konsole zu sehen. Hat das was mit der Erkennung von Sondertasten zu
tun?

Danke!

Autor: tipper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so, wie so oft, problem ist weg, und ich weiß nicht wieso. gut?

Autor: -Daniel- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

schaue dir tcsetattr, tcgetattr
tc steht für terminal control
damit sind viele Dinge möglich, zb Abschalten von Echo
damit man passwort eingeben kann usw
(kann bei bedarf Stück Code posten)

ich weiss nicht ob diese Funktionen in libc sind
aber immerhin bekommt ihr keine Abhängigkeit
ncurses dazulinken zu müssen

Grüsse, Daniel

Autor: Nico S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auja, bitte einmal das Stückchen Code posten.

Danke im Voraus,
Nico

Autor: anaktai (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Du kannst auch einfach /dev/tty mit fopen (dem Derivat deiner Wahl)
öffnen und ein Zeichen lesen. Dort wird die aktuelle Konsole (bzw. das
jeweilige tty) hingelegt.

MfG

Autor: -daniel- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zuerst Beispiel echo abschalten
////////////////////////////////////////
cat echo.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <signal.h>

struct termios term_attr;
int old_flags;

void restore()
{
    term_attr.c_lflag = old_flags;
    tcsetattr(0 /* STDIN */, TCSAFLUSH, &term_attr);
    exit(100);
}

int main()
{
    char passwd[20];
    if(tcgetattr(0, &term_attr) != 0)
        return 1;
    old_flags = term_attr.c_lflag;
    term_attr.c_lflag &= ~ECHO;
    if(tcsetattr(0, TCSAFLUSH, &term_attr) != 0)
        return 2;
    printf("Password: ");
    printf("%s", fgets(passwd, 20, stdin));
    signal(SIGINT, restore);
    while(1)
        sleep(2);
    return EXIT_SUCCESS;
}
////////////////////////////////////////


und jetzt beispiel mit Einlesen von Zeichen ohne Return
drücken zu müssen

////////////////////////////////////////////////////
cat term1.c
#include <stdlib.h>
#include <stdio.h>
#include <termios.h>
#include <string.h>
#include <signal.h>

static struct termios stored_settings;

void set_keypress(void)
{
    struct termios new_settings;
    tcgetattr(0,&stored_settings);
    new_settings = stored_settings;
    /* Disable canonical mode, and set buffer size to 1 byte */
    new_settings.c_lflag &= (~ICANON);
    new_settings.c_cc[VTIME] = 0;
    new_settings.c_cc[VMIN] = 1;
    tcsetattr(0,TCSANOW,&new_settings);
}

void reset_keypress(void)
{
    tcsetattr(0,TCSANOW,&stored_settings);
}

void sig_int()
{
    reset_keypress();
    exit(100);
}

int main()
{
    signal(SIGINT, sig_int);
    set_keypress();
    while(1)
    {
        int i = getc(stdin);
        printf("\t%c", i);
    }
    return EXIT_SUCCESS;        /* never reached */
}
////////////////////////////////////////////////////

es ist sicher noch mehr möglich
wie gesagt im Netz finden sich sicherlich andere Beispiele

Gruss, Daniel

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.