» »

[c++] Kako ugotoviti katera tipka je bila pritisnjena

[c++] Kako ugotoviti katera tipka je bila pritisnjena

zhigatsey ::

Živjo,

Ali obstaja kakšen način da bi ugotovil katera tipka je bila pritisnjena na
tipkovnici, ali pa za loviti dogodke on mousedown, mouseup, mousemove etc.
In sicer v standardnem c++ - u... Ker bi rad dobil ven portabilno kodo...
Torej brez conio.h in podobnih borlandovih zadev. Če imate kakšen link ali pa kej.

Hvala za odgovore...

Gundolf ::

Boš moral uporabiti kakšno knjižnico. In če boš želel lovii tudi miš, boš verjetno rabil knjižnico ki podpira grafiko. Priporaočam ti SDL. Je enostaven, razširljiv, temelji na principu obdelovaja sporočil in dela na razlicnih prevajalnikih v winsih, linuxu, macih in se cem.

koyotee ::

U pascalu je Readkey, poglej u help od c++, pomoje bos nasu
lp
Rear DVD collector!
JTD power!
Coming soon: bigger E-penis & new internet friendzzz!

64202 ::

koyotee: Nak, rabis knjiznico ali pa od sistema odvisno kodo.

Sicer sem se zdajle malo spilal z setvbuf, ki naj bi bil ANSI C, ampak mi ne uspe:

#include <stdio.h>

int main() {
        if(0 == setvbuf(stdin, NULL, _IONBF, 0)
           && 0 == setvbuf(stdout, NULL, _IONBF, 0)) {
                int ch;
                while((ch = getchar()) != EOF)
                        putchar(ch);
        }

        return 0;
}

Zgodovina sprememb…

  • spremenilo: 64202 ()

zhigatsey ::

Zanima me kako lahko cin objekt lahko bere iz tipkovnice, saj je tipkovnica tudi
naprava... Če lahko sprejema znake in številke potem bi mogu na kakšen način
lahko prebrati tudi ostale tipke (Enter, Esc, F5, ne vem kaj še recimo Tab ).
Zanima me v glavnem kako deluje povezava u istreamom in tipkovnico.

Gundolf ::

Saj cin je formatiran input. To pomeni da ti tipke enter ne prebere direktno ampak ti ga takoj pretvori v newLine (+ carrier return), shift se pozna na tem, da pises s veliko in ne z malo itd. To je vsa skrivnost cin-a.

64202 ::

Pa buffer ma zadeva, zato dobis tipke sele enkrat kasneje. Na konzoli je privzet newline (enter), ki ti flushne buffer.

Gundolf ::

Cin ima toliko bufferja, da si zapomni vse, dokler se ne odlocis preveriti kaj si do sedaj vpisal. Drugace pa vse lahko dobis takoj ko je pritisnjeno. Oziroma ko pritisnes enter ce beres po vrsticah. Ima pa cout svoj buffer, tako da ne izpisuje direkt na zaslon, flushus ga pa s std::endl ali pa std::flush.

64202 ::

Hm, to ze, samo meni recimo tudi read() na linuxu buferira:

$ cat x.c
#include <stdio.h>
#include <unistd.h>

int main() {
        int ret;
        char buf;
        while((ret = read(STDIN_FILENO, &buf, 1)) == 1)
                printf("Tipka %d\n", buf);

        return 0;
}
$ gcc x.c
$ ./a.out
asd
Tipka 97
Tipka 115
Tipka 100
Tipka 10


read() kolikor vem gre direktno v kernel. Mogoce ima pa to kaj veze z isatty(3) - 'does this descriptor refer to a terminal'. Ocitno kakorkoli obrnes, vedno je treba nekaj carati na sistemskem nivoju.

Gundolf ::

Kaj mislis s tem da ti ga buferira? Da ti program ne zazna tipke takoj ko je pritisnjena?

BigWhale ::

Da caka, dokler ne pritisnes enter?

Gundolf ::

Se pravi da je tudi read funkcija za formatiran input. Pa uporabi getch ali kako je ze ukaz za direktno branje pritisnjene tipke.

64202 ::

To je v ncurses, ja? Sicer sem ta primer z read() dal samo tako "za hec". Zanimivo je videti, da kernel kar precej pocne glede IO-ja. Sem do zdaj mislil, da je to vse maslo stdio/iostreamov.

Gundolf ::

Ne mislim na ncurses. Funkciji getc in getchar mislim da sta standardni v C. In gresta v kernel in pogledata katera tipka je pritisnjena. Drugace pa ima kernel kar dosti funkcij. In niso vse povsem trivialne. Ceprav tudi formatirano branje iz tipkovnice res ni ne vem kaj.

64202 ::

getchar bere po en znak iz stdio bufferja. Nisem pa gledal surs glibcja, priznam :).

Aja, getch je drugace klic v (n)curses, ki zares bere tipke.

Zgodovina sprememb…

  • spremenilo: 64202 ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] Sledenje tipkovnici

Oddelek: Programiranje
71420 (1215) TEDY
»

[c++] problem: pretvorba iz malih v velike crke

Oddelek: Programiranje
142135 (1782) Makina
»

Problem z DOSom in katera knjiga za C++

Oddelek: Programiranje
111840 (1638) Fury
»

C++ in pavza

Oddelek: Programiranje
161225 (986) napsy
»

Linux, C, kaj uporabiti namesto getchar da ne bo čakal na input?

Oddelek: Programiranje
141403 (1243) user4683

Več podobnih tem