Wie kann ich in meiner Konsolenanwendung feststellen, ob (eine) Taste(n) gedrückt wurde(n)?
Ich hatte kbhit() im Sinn, aber das schein unter UNIX nicht zu gehen: http://www.ohse.de/uwe/articles/kbhit.html
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
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!
so, wie so oft, problem ist weg, und ich weiß nicht wieso. gut?
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
Auja, bitte einmal das Stückchen Code posten. Danke im Voraus, Nico
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
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.