Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

[Guida] Leggere stato dei tasti con GetAsyncKeyState
(Questo messaggio è stato modificato l'ultima volta il: 29/08/2012, 0:57 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
Ciao a tutti,
stasera non ho molta voglia di scrivere quindi sarò brevissimo,
se volete dei chiarimenti chiedete.

In breve, per leggere lo stato dei tasti in una hack si usa di solito GetAsyncKeyState.
Avrete notato che però ha dei comportamenti strani no?
Cioè non sempre fa quello che vi aspettate.

Soprattutto quando volete con un tasto abilitare o disabilitare una funzione e vi capita che la stessa si abiliti-disabiliti N-volte e alla fine non resta nello stato desiderato...
Il motivo c'è ma non ve lo spiego.
Invece vi "presto" questa funzione che ho scritto che si occupa di restituire lo stato di un qualunque tasto ma in modo "pulito", vi ritorna un IMPULSO chiamiamolo cosi dello stato premuto del tasto.
Quindi se premete un tasto e lo tenete premuto potete stare certi che la funzione vi tornerà lo stato "premuto" SOLO UNA VOLTA, quindi potete usare questa funzione per attivare/disattivare le vostre funzioni in tutta tranquillità.

Ecco la funzione:

    C++ Programming
  1. #include <windows.h>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. bool KeyPressedPulse(int keyToCheck)
  6. {
  7. // Toggle by Digger 2012 - hackmix.altervista.org
  8.  
  9. static bool mem_pressed[256];
  10.  
  11. bool key_pressed = false;
  12. bool key_pulse = false;
  13.  
  14. // ricaviamo l'IMPULSO del tasto
  15. if ((GetAsyncKeyState(keyToCheck)& 0x8000) ==0x8000)
  16. key_pressed=true;
  17. else
  18. key_pressed=false;
  19.  
  20. if (key_pressed && ! mem_pressed[keyToCheck])
  21. {
  22. mem_pressed[keyToCheck] = true;
  23. key_pulse = true;
  24. }
  25.  
  26. if (!key_pressed)
  27. {
  28. mem_pressed[keyToCheck] = false;
  29. }
  30.  
  31. return (key_pulse);
  32. }



Se volete vedere come si comporta ecco un mini programmino che non fa altro che visualizzare a video se avete premuto il tasto Spazio, F1, F2 o Alt-F3

Come vedrete la scritta corrispondente compare 1 sola volta a video, anche se tenete premuto il relativo tasto.

Programma completo:

    C++ Programming
  1. #include <windows.h>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. bool KeyPressedPulse(int keyToCheck)
  6. {
  7. // Toggle by Digger 2012 - hackmix.altervista.org
  8.  
  9. static bool mem_pressed[256];
  10.  
  11. bool key_pressed = false;
  12. bool key_pulse = false;
  13.  
  14. // ricaviamo l'IMPULSO del tasto
  15. if ((GetAsyncKeyState(keyToCheck)& 0x8000) ==0x8000)
  16. key_pressed=true;
  17. else
  18. key_pressed=false;
  19.  
  20. if (key_pressed && ! mem_pressed[keyToCheck])
  21. {
  22. mem_pressed[keyToCheck] = true;
  23. key_pulse = true;
  24. }
  25.  
  26. if (!key_pressed)
  27. {
  28. mem_pressed[keyToCheck] = false;
  29. }
  30.  
  31. return (key_pulse);
  32. }
  33.  
  34.  
  35. int main()
  36. {
  37. while (!GetAsyncKeyState(VK_ESCAPE))
  38. {
  39. if (KeyPressedPulse(VK_SPACE)) cout << "Spazio" << endl;
  40. if (KeyPressedPulse(VK_F1)) cout << "F1" << endl;
  41. if (KeyPressedPulse(VK_F2)) cout << "F2" << endl;
  42. if (GetAsyncKeyState(VK_MENU) && KeyPressedPulse(VK_F3)) cout << "Alt-F3" << endl;
  43. }
  44. }



ciao


digger
28/08/2012, 23:27
#1
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
che complicazioni...
ho risposto in un altro topic..
quello del nomenù di poccio se nn sbaglio..

28/08/2012, 23:57
#2
Cerca

Amministratore
Messaggi: 2,333
Discussioni: 231
Registrato: 03-2011
Mix: 2,569
Ottima guida.


[Per vedere i link devi REGISTRARTI.]

Prima di aprire ogni contenuto scaricato su siti esterni ad HackMix, scansionatelo su VirusTotal.
29/08/2012, 0:03
#3
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 29/08/2012, 0:59 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
beh di fatto il 90% delle volte non serve utilizzare un qualcosa del genere, ma in certi casi, per avere un comportamento sempre uguale e lineare una funzione cosi ti salva la vita altrimenti rischi che accadano cose strane. Se provi a fare un mini programma che ti fa vedere cosa ti torna GetAsyncKeyState lo capirai, vedrai che non torna quello che ti aspetti.

La soluzione che proponi tu nell'altro post potrebbe anche andare (non l'ho provato ma mi fido dei tuoi test) ha solo un problema, che se uno tiene premuto il tasto la funzione non va piu avanti e tieni bloccata anche la hack che smette di funzionare, oltre al fatto che "agisce" quando rilasci il tasto invece che quando lo premi.
So che nessuno starebbe li con il tasto premuto, ma comunque resta il fatto che è non mi piacerebbe metterlo in un mio codice Wink

Comunque se ci pensi bene non è una gran complicazione, tieni conto che la funzione la scrivi (o copincolli) una volta sola, dopo di che nel codice tutto quello che devi fare è chiamare questa funzione invece che GetAsyncKeyState, quindi non è poi cosi complicato Happywide


digger
29/08/2012, 0:54
#4
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
è voluta, per evitare che si premesse troppo a lungo un tasto e la funzione asm del textingame facesse crashare il gioco Happywide

Mica uno ci deve prendere la residenza sul tasto f5, lo deve premere al volo e lasciarlo Smile

29/08/2012, 10:09
#5
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
(29/08/2012, 10:09)Skyline@69 Ha scritto:

[Per vedere i link devi REGISTRARTI.]

...
Mica uno ci deve prendere la residenza sul tasto f5, lo deve premere al volo e lasciarlo Smile
ahah bellissima questa, te la copio e la riutilizzo Happywide


digger
29/08/2012, 11:00
#6
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Mix: 0
Quindi questa va messa nel mio scope??Smile

29/08/2012, 11:53
#7
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 29/08/2012, 13:07 da Skyline@69.)

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
(29/08/2012, 11:00)digger Ha scritto:

[Per vedere i link devi REGISTRARTI.]

(29/08/2012, 10:09)Skyline@69 Ha scritto:

[Per vedere i link devi REGISTRARTI.]

...
Mica uno ci deve prendere la residenza sul tasto f5, lo deve premere al volo e lasciarlo Smile
ahah bellissima questa, te la copio e la riutilizzo Happywide

Io la uso tutte le volte che mentre si passeggia la gente si ferma in mezzo alla strada a parlare e sbaciucchiarsi bloccando il traffico Happywide

(29/08/2012, 11:53)Pocciox Ha scritto:

[Per vedere i link devi REGISTRARTI.]

Quindi questa va messa nel mio scope??Smile

Potresti...

29/08/2012, 13:07
#8
Cerca


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  [Guida] C++ scrivere e leggere file di testo(settaggi) via WEB Cyanstack 4 1,363 05/06/2014, 21:58
Ultimo messaggio: Cyanstack
  C++ scrivere e leggere files di testo (settaggi) digger 6 1,243 07/12/2013, 21:49
Ultimo messaggio: Pocciox
  lice Gate 2 Plus. Come leggere SNR, Attenuazione... andry700 7 1,326 22/08/2011, 22:12
Ultimo messaggio: digger



Utenti che stanno guardando questa discussione: 1 Ospite(i)