Khbit()
nadhem09
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
-
nadhem09 Messages postés 7 Date d'inscription Statut Membre Dernière intervention -
nadhem09 Messages postés 7 Date d'inscription Statut Membre Dernière intervention -
Bonjour
je doit créer une fonction qui permet de renvoie true si un nouveau '1' de keybord a été
détecté ou false dans le cas contraire. lorsqu’un choc est détecté, cette fonction ne renvoie
qu’une seule fois true,
est ce qu' il est possible de renvoi une seule foix true si je reste appui sur 1.
ceci mon code :
je doit créer une fonction qui permet de renvoie true si un nouveau '1' de keybord a été
détecté ou false dans le cas contraire. lorsqu’un choc est détecté, cette fonction ne renvoie
qu’une seule fois true,
est ce qu' il est possible de renvoi une seule foix true si je reste appui sur 1.
ceci mon code :
unsigned char DETECTEUR_CHOC_NewIsDetcted(void) { char Value ; //static char CountValue ; if ( kbhit()) { Value = getch () ; switch(Value) { case '1' : return true ; break ; case '0' : default : return false ; break ; } } else { return false ; } }
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles : ICI Merci d'y penser dans tes prochains messages. |
5 réponses
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 :
nadhem09
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
oui merci pour la correction.
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
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
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.
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