Newsgroup: it.comp.lang.c
Titolo: Come si fa per rilevare la pressione di un tasto?

Salve a tutti,
Come si fa per far rilevare al C o al C++ la pressione di un tasto? (ad
esempio le frecce cursore)
Girovagando nei meandri della guida ho trovato la funzione di conio.h  int
kbhit(), che però restituisce 1 quando un qualsiasi tasto è premuto, non
restituisce quale...
se qualcuno sa aiutarmi...
Grazie.
Predator

...


 >Predator
-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/
       Search, Read, Discuss, or Start Your Own    

...


risposta.
Purtroppo, non essendoci gruppi italiani dedicati alla
programmazione su specifici ambienti, su questo gruppo,
e it.comp.lang.c++, cadono di necessita` tutte le domande
relative alla programmazione di basso livello, dipendente
dal sistema.  OK, hai ragione nel fatto che sarebbe stato
meglio dire "dipende dal sistema, in DOS ad esempio", ecc;
io _cerco_ sempre di ricordarmi, visto che *quasi mai* chi
pone la domanda ha la cortesia di precisarlo!, di dire che
la risposta dipende da Win32, eccetera, ma e` naturale
rispondere alla domanda scordandosi tali precisazioni...!
Stiamo cercando (vedi it.news.gruppi) di formare il gruppo
it.comp.programmazione.win32 -- se funziona, si potranno
dirottare la` tutte le domande relative a questo ambiente;
similmente, si potrebbe, se questo riesce, fare anche un
it.comp.programmazione.dos, per detto ambiente, ancora
tanto diffuso.  Cosi`, personalmente, potro` ad esempio
scegliere di seguire .win32, e lasciare .dos a chi di quello
si interessa, ecc ecc -- idealmente, facendo di it.comp.lang.c
(e .c++) gruppi per la discussione dei linguaggi, e delle
relative librerie, NON di specifici ambienti...!!!
Purtroppo, un componente del GCN sembra incapponito a
voler bloccare il nome che sopra cito, in favore del (secondo
me terribile) it.comp.prog.win32, che sembra fatto apposta
per essere ambiguo ("prog"="prograMMI"...! -- vedete un
po' che si discute oggi in it.comp.prog...!); chiunque e`
interessato a questi temi di "nomi accurati e precisi per i
gruppi di discussione" e` benvenuto a passare sul gruppo
it.news.gruppi, al quale vanno limitate le discussioni in merito.
Alex

risposte pullulano.
Sicuramente; e se, com'e` probabile, ho a volte scordato di
precisare, nella "pullulante" risposta, che essa dipende dal
sistema operativo, sono pronto a cospargermi il capo di
cenere (per un fumatore, come sono, non e` difficile:-).
Ma, perche` non cerchiamo di _migliorare_ questa situazione,
che obbliga chi non sarebbe per nulla interessato a un dato
ambiente, a scaricarsi e saltare comunque tante domande, e
risposte, relative solo a quell'ambiente?  L'unica, secondo me,
e` formare gruppi _appositi_, almeno per i vari ambienti
"popolari".  Linux ne ha uno, mi pare; DOS, e Win32, invece
ne mancano.  La discussione andrebbe proseguita su
it.news.gruppi, "a norma delle regole"...
Alex

E che cavolo...
Ma come fo a sapere che la mia risposta trova soluzione solo nelle MFC?  ;-)
Comunque ho postato la domanda in tutti e due i newsgroup.
Io uso windows 95, se qualcuno sa dirmi come fare...
Buon natale a tutti.
Predator
Alex Martelli ha scritto nel messaggio ...


Io uso windows 95, se qualcuno sa dirmi come fare...
In una applicazione nativa Windows, cioe` una dotata di
un ciclo degli eventi, la "pressione di un tasto" causa un
messaggio WM_KEYDOWN diretto alla procedura di finestra
della finestra che ha il "focus di input"; normalmente,
TranslateMessage (o, IsDialogMessage, se hai messaggi
diretti a dialoghi non-modali o loro finestre-figlie) fa inoltre
si` che il WM_KEYDOWN produca un WM_CHAR.  Hai dunque
molte opzioni per intercettare e/o gestire questi messaggi,
fra cui, se vuoi farlo in modo del tutto indipendente dalla
tua finestra cui sono diretti, quella di guardare il messaggio
subito dopo il GetMessage o PeekMessage del tuo ciclo degli
eventi, prima ancora di tradurlo e diramarlo.  Quest'ultima
opzione non l'hai se usi un dialogo modale (compresa una
message-box), poiche` esso gestisce per conto proprio un
ciclo di eventi, comunque puoi sempre gestire WM_KEYDOWN
eccetera sulle tue finestre (compreso, se occorre, con un
subclassing, eventuali controlli contenuti).
Se hai una applicazione Windows95 _di console_, la
situazione e`, naturalmente, diversissima.  L'API
PeekConsoleInput puo` essere quella che desideri,
se intendi solo verificare se vi sia stato un qualche
input o meno; se vuoi fermarti, _aspettando_ che
un qualche input si verifichi, puoi provare con un
WaitForSingleObject, o una qualsiasi delle sue tante
varianti arricchite, naturalmente sulla handle della
tua console (puoi ottenerla, se gia` non la conosci,
chiamando CreateFile con "CONIN$" come "nome
del file", naturalmente).
Potrei continuare ancora abbastanza a lungo questo
trattatello elementare sulle API di Windows95 di
una qualche potenziale rilevanza alla tua domanda,
visto che, naturalmente, su ciascuno dei sotto-temi
che ho accennato c'e` molto, ma MOLTO, da dire,
ma forse, che dici, sarebbe invece piu` sensato che
fossi tu a chiarirci un poco meglio i parametri del
tuo problema?!  Quale compilatore usi, in C o in C++,
c'e` un framework di mezzo, pensi ad applicazioni di
console, dialoghi modali, dialoghi non-modali, con
o senza controlli di vari tipi in essi, o vuoi tu stesso
fare sviluppo di controlli ActiveX, o subclassing di un
qualche common control, o...?  A seconda delle tue
esatte circostanze, il metodo migliore per "rilevare
la pressione di un tasto" cambiera`, anche in modo
drastico.  A volte, una domanda puo` essere posta
in modo VERAMENTE disastroso, non ti pare...?
Alex

sicuro di non confondere gruppo, magari con it.comp.lang.c++?
La cosa piu' probabile spesso e' quella giusta. Mi sono chiaramente confuso.
Antonio Donatiello