Gast
#385654
Wie kann ich in meiner Konsolenanwendung feststellen, ob (eine) Taste(n) gedrückt wurde(n)?
|
Anzeige
|
C, Linux: Tastatur-Puffer abfragen?
Gast
#385654
Wie kann ich in meiner Konsolenanwendung feststellen, ob (eine) Taste(n) gedrückt wurde(n)?
Gast
#385655
Ich hatte kbhit() im Sinn, aber das schein unter UNIX nicht zu gehen: http://www.ohse.de/uwe/articles/kbhit.html
Gast
#385656
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
Gast
#385657
getch() aus der ncurses lib.
Gast
#385658
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!
Gast
#385659
so, wie so oft, problem ist weg, und ich weiß nicht wieso. gut?
Gast
#385660
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
Gast
#385661
Auja, bitte einmal das Stückchen Code posten. Danke im Voraus, Nico
Gast
#385662
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
Gast
#385663
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 schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|