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
Reputazione:
106

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


Messaggi in questa discussione
Leggere stato dei tasti con GetAsyncKeyState - da digger - 28/08/2012, 23:27
[Nessun oggetto] - da Skyline@69 - 28/08/2012, 23:57
[Nessun oggetto] - da Admin - 29/08/2012, 0:03
[Nessun oggetto] - da digger - 29/08/2012, 0:54
[Nessun oggetto] - da Skyline@69 - 29/08/2012, 10:09
[Nessun oggetto] - da digger - 29/08/2012, 11:00
[Nessun oggetto] - da Skyline@69 - 29/08/2012, 13:07
[Nessun oggetto] - da Pocciox - 29/08/2012, 11:53

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



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