Billentyű-gomb megnyomás érzékelés

 ( pelz | 2008. január 11., péntek - 18:19 )

Sziasztok!

Kezdő vagyok a c-ben. Nem tudom, hogyan lehet olyan progit írni, ami figyeli, hogy lenyomták-e a billentyűzetet. Mindenhol a getchar függvénnyel találkozom, de ez csak akkor kapja meg a feldolgozásra a karaktereket, ha felhasználó már ENTER-t is leütötte.
És természetesen ehhez kapcsolódó kérdés, hogy mivel lehet abban a pillanatban kiolvasni a leütött karaktert, amikor lenyomták?

További kérdésem: Több karakterbeolvasó példa-programban találtam egy EOF konstanst, amit azért tettek be a progikba, hogy figyeljék mikor van vége az adatbevitelnek. Hogyan lehet a billentyűzetről aktiválni az EOF jelzést. Én rengeteg variációt kipróbáltam, de nem találtam meg. Át kellett térnem az ESC billentyűre, vagy egyszerűen az ENTER-re.

Előre is kösz a segítséget!

Üdv: Pelci.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Szabványos módja nincs neki, hogy billentyűleütést érzékelj. Linux alatt curses/ncurses-el megoldható. EOF-ot Ctrl-D-vel tudsz bevinni (linuxon).

Kösz Caro!

Szerencsére Linux-om van. Ez a függvények melyik könyvtárban vannak?

A curses vagy az ncurses azok függvénykönyvtárak. Fel kell tenni a libncurses-dev, vagy hasonló nevű csomagot. Leírás itt: http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/
Ami neked kell, az itt: http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/keys.html

Kösz mégegyszer!
Letöltöttem.

Már hogyne lenne szabványos megoldás! Pusztán ezért kár függeni a cursestől...

#include <stdio.h>
#include <ctype.h>
#include <termios.h>
#include <unistd.h>

int
main(void)
{
  int c;
  struct termios ti_orig, ti_new;

  /* eredeti terminalbeallitasok mentese */
  tcgetattr(0, &ti_orig);

  /* nem sorpufferelt, nem echo-zo beallitasok eloallitasa */
  tcgetattr(0, &ti_new);
  ti_new.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(0, TCSANOW, &ti_new);

  /* teszt kod, hogy lassuk, mit is ertunk el */
  for (c = 0; c != 27; printf("char '%c' = %d\n", isprint(c) ? c : '.', c))
    c = getchar();

  /* eredeti beallitasok vissza */
  tcsetattr(0, TCSANOW, &ti_orig);

  /* ennyi volt */
  return 0;
}

Linux es FreeBSD alatt pöccre fordul és megy. A terminál-kezelési beállításokért lásd 'man tcsetattr', a rusnya 'for'-ért meg bocsesz, épp igyekszem nyugodtabban kapkodni :)...
Szerk.: Ja, kilépés ESC-vel, úgyhogy pl. az irány-billentyűk kódjait nem fogod látni, mert azok olyan több byte-os kódsorozatokat generálnak, amik pont ESC-vel kezdődnek, pl. 'fel' = 'ESC [ A', (Linux alatt 'man console_codes'), de ez már tényleg rendszerfüggő. (Na jó, a nyíl-billentyűk talán pont nem, de a funkcióbillentyűk, pgup/pgdn és társaik már igen.)