Khbit()
Fermé
nadhem09
Messages postés
7
Date d'inscription
jeudi 4 mars 2021
Statut
Membre
Dernière intervention
15 mars 2021
-
Modifié le 10 mars 2021 à 10:18
nadhem09 Messages postés 7 Date d'inscription jeudi 4 mars 2021 Statut Membre Dernière intervention 15 mars 2021 - 15 mars 2021 à 08:16
nadhem09 Messages postés 7 Date d'inscription jeudi 4 mars 2021 Statut Membre Dernière intervention 15 mars 2021 - 15 mars 2021 à 08:16
5 réponses
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
Modifié le 10 mars 2021 à 16:24
Modifié le 10 mars 2021 à 16:24
Bonjour,
Tu veux surement dire:
est ce qu' il est possible de renvoyer une seule fois true si je reste appuyé sur 1.
ceci est mon code :
Tu veux surement dire:
est ce qu' il est possible de renvoyer une seule fois true si je reste appuyé sur 1.
ceci est mon code :
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
10 mars 2021 à 20:50
10 mars 2021 à 20:50
La question est mal posée, je pense, par rapport à ce que tu veux faire réellement et dans quel contexte, ce que tu n'expliques pas, et donc il est difficile de te répondre efficacement.
Si ce que tu veux c'est déterminer quand une touche est relachée (ce qui veut dire qu'elle a été enfoncée), tu peux essayer de regarder du côté de GetAsyncKeyState() de l'API Windows,
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getasynckeystate
et consulter l'état du bit "recently pressed".
Cela sera plus ou moins fiable, pour plusieurs raisons.
Ce sera toujours plus fiable que d'appeler une fonction comme kbhit() en conservant la mémoire du résultat pour tenter de déduire le statut de la touche.
Une autre solution, plus complexe est de créer une application Windows (et non terminal) et d'intercepter les événements système du clavier. Je ne décrirais pas plus ce procédé, car il revient à utiliser des techniques permettant de créer des keyloggers.
Dal
Si ce que tu veux c'est déterminer quand une touche est relachée (ce qui veut dire qu'elle a été enfoncée), tu peux essayer de regarder du côté de GetAsyncKeyState() de l'API Windows,
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getasynckeystate
et consulter l'état du bit "recently pressed".
Cela sera plus ou moins fiable, pour plusieurs raisons.
- la vitesse à laquelle ta boucle interroge le statut de la touche
- une autre application que la tienne peut interférer comme indiqué dans la doc Microsoft
Ce sera toujours plus fiable que d'appeler une fonction comme kbhit() en conservant la mémoire du résultat pour tenter de déduire le statut de la touche.
Une autre solution, plus complexe est de créer une application Windows (et non terminal) et d'intercepter les événements système du clavier. Je ne décrirais pas plus ce procédé, car il revient à utiliser des techniques permettant de créer des keyloggers.
Dal
nadhem09
Messages postés
7
Date d'inscription
jeudi 4 mars 2021
Statut
Membre
Dernière intervention
15 mars 2021
11 mars 2021 à 08:31
11 mars 2021 à 08:31
le question c'est de créer une fonction qui va détecter le choc. le choc est présenté par un clic sur le '1 ' du clavier. si je reste appuyé longtemps sur le 1 du clavier ca c'est la même choc et non pas un nouveau choc ,donc la fonction doit renvoyer 'true' une seule fois.
j'espère qui il est clair.
merci pour votre réponse
j'espère qui il est clair.
merci pour votre réponse
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié le 11 mars 2021 à 11:21
Modifié le 11 mars 2021 à 11:21
GetAsyncKeyState function (winuser.h)
Determines whether a key is up or down at the time the function is called, and whether the key was pressed after a previous call to GetAsyncKeyState.
Cette fonction (avec les limitations que j'ai signalées) te permet de déterminer si une touche est pressée et si elle l'était déjà la fois précédente que cette fonction a été appelée.
Determines whether a key is up or down at the time the function is called, and whether the key was pressed after a previous call to GetAsyncKeyState.
Cette fonction (avec les limitations que j'ai signalées) te permet de déterminer si une touche est pressée et si elle l'était déjà la fois précédente que cette fonction a été appelée.
nadhem09
Messages postés
7
Date d'inscription
jeudi 4 mars 2021
Statut
Membre
Dernière intervention
15 mars 2021
>
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
12 mars 2021 à 10:24
12 mars 2021 à 10:24
j'ai essayé avec cette fonction mais c'est la même problème ici
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié le 13 mars 2021 à 00:28
Modifié le 13 mars 2021 à 00:28
Salut nadhem09,
Comme tu ne montres pas ton code utilisant GetAsyncKeyState(), je ne sais pas ce que tu as fait ni pourquoi tu affirmes que tu as le même problème.
La doc de GetAsyncKeyState() dont j'ai posté le lien dit :
"if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState (...) However, you should not rely on this last behavior; for more information, see the Remarks."
Donc en testant le résultat de
Sinon, j'ai trouvé une 3ème solution qui devrait être plus fiable et ne nécessite pas de passer par une interception système si cela ne te fait rien que seules les touches pressées sur la fenêtre de console active soient prises en compte.
Elle fonctionne en récupérant un HANDLE sur l'entrée standard de la console, en traitant les événements clavier et en conservant le statut de la touche d'un appel sur l'autre à la fonction de traitement.
J'ai commenté le code :
Dal
Comme tu ne montres pas ton code utilisant GetAsyncKeyState(), je ne sais pas ce que tu as fait ni pourquoi tu affirmes que tu as le même problème.
La doc de GetAsyncKeyState() dont j'ai posté le lien dit :
"if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState (...) However, you should not rely on this last behavior; for more information, see the Remarks."
Donc en testant le résultat de
if (GetAsyncKeyState(0x31) & 0x8000))tu devrais pouvoir déterminer que le la touche était déjà pressée lors du dernier appel à cette fonction (avec les limitations indiquées).
Sinon, j'ai trouvé une 3ème solution qui devrait être plus fiable et ne nécessite pas de passer par une interception système si cela ne te fait rien que seules les touches pressées sur la fenêtre de console active soient prises en compte.
Elle fonctionne en récupérant un HANDLE sur l'entrée standard de la console, en traitant les événements clavier et en conservant le statut de la touche d'un appel sur l'autre à la fonction de traitement.
J'ai commenté le code :
#include <stdio.h> #include <time.h> #include <stdbool.h> #include <windows.h> int detecteur_choc_sur_touche_1(HANDLE hcin, bool * deja_presse) { INPUT_RECORD event; DWORD count; ReadConsoleInput(hcin, &event, 1, &count); if ( (event.Event.KeyEvent.wVirtualKeyCode == 0x31) && (event.EventType == KEY_EVENT) ) { /* touche pressée et non déjà pressée avant ? */ if ( event.Event.KeyEvent.bKeyDown && !(*deja_presse) ) { *deja_presse = true; return 1; } /* touche relachée ? */ if (!event.Event.KeyEvent.bKeyDown) *deja_presse = false; } return 0; } int main(void) { printf("Le present programme va s'executer pendant 10 secondes" " et compter le nombre de fois que la touche 1 est pressee.\n" "Note : maintenir la touche pressee compte pour 1 fois\n"); /* récup HANDLE et mettre la console en mode raw */ HANDLE hcin = GetStdHandle(STD_INPUT_HANDLE); DWORD mode = GetConsoleMode(hcin, &mode); SetConsoleMode(hcin, 0); /* calcul de la temporisation sur 10 secondes */ DWORD currentTime = GetTickCount(); DWORD endTime = currentTime + (1000 * 10); /* variables de décompte et conservation de l'état */ int count_chocs = 0; bool deja_presse = false; while (1) { if (GetTickCount() > endTime) break; if (WaitForSingleObject(hcin, 0) == WAIT_OBJECT_0) count_chocs += detecteur_choc_sur_touche_1(hcin, &deja_presse); Sleep(10); } printf("J'ai compte %d chocs pendant ces 10 secondes\n", count_chocs); /* restauration état console */ SetConsoleMode(hcin, mode); return 0; }
Dal
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
nadhem09
Messages postés
7
Date d'inscription
jeudi 4 mars 2021
Statut
Membre
Dernière intervention
15 mars 2021
15 mars 2021 à 08:16
15 mars 2021 à 08:16
ca marche . merci infiniment
10 mars 2021 à 16:27