Eli voisko joku kertoa alottelevalle C++ ohjelmoijalle, että miten C++:ssa luetaan näppistä?
Vaikka cinillä. Eli esimerkiksi komento cin >> nimi; tallentaa nimi-muuttujaan näppäimistöltä syötetyn tiedon. Etsi googlella joku hyvä C++-tutoriaali.
Joo, mut ton mä tiesin ennestään ja tarkotin lähinnä sellasta, että ei tartte painaa entteriä syötön jälkeen vaan se reagois siihen heti kun käyttäjä painaa nappulaa(jossain loopissa esimerkiks).
jos on wintoosa nii GetAsyncKeyState(<näppäinkoodi>)
bob, Windows NT/2000/XP: The return value is zero for the following cases: The current desktop is not the active desktop (or) The foreground thread belongs to another process and the desktop does not allow the hook or the journal record. (msdn)
GetAsyncKeyState ei ole myöskään sidottu kutsuvaan säikeeseen, josta voi seurata yllätyksiä.
Mitään standardia tapaa ei ole. Kääntäjän mukana saattoi tulla otsikkotiedosto conio.h, josta todennäköisesti löytyy funktio getch. Epästandardia funktiota ei kannata kuitenkaan omaksua standardiksi, vaikka se olisikin kääntäjän kyljessä.
Olen kirjoittanut omaan käyttööni anykey-funktion, joka toimii Windowsissa. Funktio ei tunne extended-koodeja, joten esim. pelkän shiftin painallus hyväksytään.
Tässä funktio. Vaatii otsikon windows.h. Funktio on laiskaa käsialaa, joten en suosittele tuotantokäyttöön tahi opiksi otettavaksi. ;-)
CHAR anykey() { HANDLE cinp = 0; DWORD cstate = 0; DWORD nread = 0; CHAR key = 0; INPUT_RECORD inprec; cinp = GetStdHandle(STD_INPUT_HANDLE); if(cinp == INVALID_HANDLE_VALUE) return 0; GetConsoleMode(cinp, &cstate); SetConsoleMode(cinp, 0); while(1) { if(!ReadConsoleInput(cinp, &inprec, 1, &nread) || !nread) return 0; if(inprec.EventType == KEY_EVENT && inprec.Event.KeyEvent.bKeyDown) { key = inprec.Event.KeyEvent.uChar.AsciiChar; break; } } SetConsoleMode(cinp, cstate); return key; }
Siis... kuinka tota käytetään, kun mä en tajuu puoliakaan mitä tossa funktiossa tehään ja toisekseen mulla ei leikkaa kuinka mää kutsun tota funktiota tai jotai(toivottavasti ymmärsitte).
Siis kun on tullu tota QB:tä vähän väännettyä niin siinä on joku ihme portti josta voi lukea näppäinpainalluksia ja tallentaa ne muuttuja talukkoon ja lukea sitten tyyliin:
DO
IF nap(1) = 1 THEN 'jos painetaan ESC näppäintä
tee jotain 'niin tehdään jotain
ELSE IF nap(1) = 0 'jos taas ei paineta ESC näppäintä
tee jotain muuta 'niin tehdään jotain muuta
END IF 'lopetetaan if lause
LOOP
'-merkki erottaa komennon ja kommentin!
Voisiko joku, tämän kaiken jälkeen, näyttää saman tyylisen esimerkin vaikka tuolla vaden funktiolla. Eli joku looppi jossa odotetaan, että käyttäjä painaa jotain nappia?
Mulla ei leikkaa... :\
Näin se toimii (huom. siistitty anykey!):
#include <iostream> #include <windows.h> CHAR anykey(); int main() { CHAR c = 0; while(1) { c = anykey(); if(c == 27) // esc { std::cout << "ESC - poistutaan" << std::endl; break; } else std::cout << c << std::endl; } } CHAR anykey() { HANDLE cinp = 0; DWORD nread = 0; INPUT_RECORD inprec; cinp = GetStdHandle(STD_INPUT_HANDLE); if(cinp == INVALID_HANDLE_VALUE) return -1; while(1) { if(!ReadConsoleInput(cinp, &inprec, 1, &nread) || !nread) break; if(inprec.EventType == KEY_EVENT && inprec.Event.KeyEvent.bKeyDown) return inprec.Event.KeyEvent.uChar.AsciiChar; } return -1; }
Dou... niinpä tietenkin :). Tuo funktio tietenkin palauttaa sen näppäinpainalluksen "arvon". Siitä sitten... miksen mää tajunnu :/
Kiitos! :)
Tuota QB-koodilla esittelemääsi "nap" taulukkoa voi jäljitellä käyttämällä GetKeyboardState funktiota (http://msdn.microsoft.com/library/default.asp?
Tosiaan, GetAsyncKeyState ei (kuten ei GetKeyboardState:kaan) ole konsolipohjaiseen syöttöön todellakaan paras vaihtoehto, mutta jos sitä joku meinaa käyttää niin muistaa sitten että GetAsyncKeyState ei palauta TRUE/FALSE flägiä, vaan esim. tieto siitä onko näppäin pohjassa löytyy bitistä numero 15, eli tuota tulisi käyttää tähän tyyliin (ellei halua jostain syystä sitten toisenlaista käytöstä):
if(GetAsyncKeyState(VK_RETURN) & 0x8000) { /* returnia painetaan */ }
Joo... noita tapoja löytyy varmasti monia, mutta en niitä kaikkia lähde nyt opettelemaan(yksi riittää tähän hätään).
Aihe on jo aika vanha, joten et voi enää vastata siihen.