VC++6.0 Savoir si une touche a été enfoncée

VC++6.0 Savoir si une touche a été enfoncée - C++ - Programmation

Marsh Posté le 20-06-2004 à 06:14:05    


Bonjour,  
 
Je cherche a savoir dans mon programme si une touche a été enfoncée à un moment donné.
 
j'ai trouvé  
 
if ((GetKeyState(VK_ESCAPE) < 0)  
   /* instructions */
 
mais ca, ca me dit si la touche est enfoncé ou pas alors ke moi je veux savoir si la touché "a été enfoncée",nuance.
 
Dans mon programme je fais différent traitements et donc je ne peux pas faire de GetKeyState tout le temps.
 
Je ne sais pas si une telle fonction existe..
Merci de m'éclairer sur cette situation.
 
 
 
 
 
 

Reply

Marsh Posté le 20-06-2004 à 06:14:05   

Reply

Marsh Posté le 20-06-2004 à 09:59:10    

Et si tu fais une boucle qui vérifie en permanence ?
Je dis peut-être une connerie, mais pour moi c'est la seule façon. Si tu ne vérifies pas toi même toutes les x secondes/10ème de seconde et que tu veux qu'une autre fonction le fasse pour toi, autant le faire directement.


Message édité par WhatDe le 20-06-2004 à 10:00:47

---------------
[:whatde]
Reply

Marsh Posté le 20-06-2004 à 13:21:26    

Je pense qu'il va falloir que vous gériez vous-même cette info par exemple en scrutant les messages à partir d'un PreTranslateMsg de la fenêtre de plus haut niveau. La solution marteau serait sinon de poser le hook qui va bien.

Reply

Marsh Posté le 20-06-2004 à 19:29:36    

Code :
  1. while(1)
  2. {
  3. if ((GetKeyState(VK_ESCAPE) < 0) 
  4. {
  5. nbtouchesenfonced +=1;
  6. break;
  7. }
  8. }


 
?


---------------
http://sylvainm.chez.tiscali.fr mon site qu'il est bieng
Reply

Marsh Posté le 20-06-2004 à 21:27:14    

Code :
  1. GetKeyState(VK_ESCAPE) == -32768


Reply

Marsh Posté le 20-06-2004 à 21:31:21    

MsHome a écrit :

Code :
  1. while(1)
  2. {
  3. if ((GetKeyState(VK_ESCAPE) < 0) 
  4. {
  5. nbtouchesenfonced +=1;
  6. break;
  7. }
  8. }


 
?


[:aaah]
mais ça va pas non ? c'est crade, et ça bouffe toutes les ressources !!!
le mieux et le plus élégant selon moi est de poser un hook de type WH_KEYBOARD via la fonction SetWindowsHookEx, voir MSDN pour cette fonction.
Ne pas oublier d'appeler CallNextHookEx pour traiter les hooks de Windows


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-06-2004 à 22:07:46    

mais non un ptit Sleep(1) et on nen parle plus  
 
:D (oui oui c tres sale)


Message édité par red faction le 20-06-2004 à 22:07:57
Reply

Marsh Posté le 21-06-2004 à 00:44:19    

La prog Windows est évènementielle. Faut simplement réagir à l'évènement WM_SYSKEYDOWN et maintenir une trace de cet appui.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 21-06-2004 à 08:44:55    

Et WM_KEYDOWN également, non ?

Reply

Marsh Posté le 21-06-2004 à 09:51:21    

Citation :

The WM_KEYDOWN message is posted to the window with the keyboard focus when a nonsystem key is pressed. A nonsystem key is a key that is pressed when the ALT key is not pressed.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 21-06-2004 à 09:51:21   

Reply

Marsh Posté le 21-06-2004 à 10:20:44    

Et ?  
Sauf erreur de ma part la question ne portait pas seulement sur la touche ALT+ qqchose

Reply

Marsh Posté le 21-06-2004 à 12:46:10    

tu peux pas faire un thread qui regardera à chaque fois si la touche est enfoncée ou non ?

Reply

Marsh Posté le 21-06-2004 à 12:51:45    

riskoulah a écrit :

tu peux pas faire un thread qui regardera à chaque fois si la touche est enfoncée ou non ?


mais putain, pourquoi vous préconisez des solutions dégueulasses alors que l'OS propose plein de solutions propres ? :cry: :cry:
 
- ou bien on utilise un Hook (proposé par DocMaboul et moi),
- ou bien on utilise la fonction RegisterHotKey() (proposé par moi,
je viens d'y penser à l'instant)
- ou bien on utilise la pompe à messages (proposé par HelloWorld)
- ou bien on passe par PreTranslateMessage() sur la fenêtre mêre (DocMaboul)
 
tout ça est bien propre, et ne bloque pas le système comme les autres solutions proposées, par pitié, utilisez l'API :sweat:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 21-06-2004 à 14:04:38    

cricri_ a écrit :

Et ?  
Sauf erreur de ma part la question ne portait pas seulement sur la touche ALT+ qqchose


Heu, j'ai loupé un truc.
Il m'a semblé lire ALT uniquement. J'ai du confondre avec un autre post.
Désolé.
Donc oui WM_KEYDOWN. :jap:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 21-06-2004 à 18:01:38    

wè j'ai testé le while(1) {...} dan 1 thread en mettant un sleep(1) mais ca me prend tjs 100% du proc.
 
quand au RegisterHotKey() c a l'air pas mal mais ...chaud a utiliser.
BOOL RegisterHotKey(
HWND hWnd,
    int id,
    UINT fsModifiers,
    UINT vk
);
 
 
 
 

Reply

Marsh Posté le 21-06-2004 à 18:08:31    

bon le hWnd OK , UINT vk OK aussi...
UINT fsModifiers, ca me propose une combinaison de touche bon wè si on veut...
 
Mais pour int id alors la je vois trop pas cke c "id"
 
[in] Specifies the identifier of the hot key. No other hot key in the calling thread should have the same identifier. An application must specify a value in the range 0x0000 through 0xBFFF. A shared dynamic-link library (DLL) must specify a value in the range 0xC000 through 0xFFFF (the range returned by the GlobalAddAtom function). To avoid conflicts with hot-key identifiers defined by other shared DLLs, a DLL should use the GlobalAddAtom function to obtain the hot-key identifier.
 
Merci pour votre aide pr utiliser simplement cette fonction
 

Reply

Marsh Posté le 21-06-2004 à 18:40:37    

Balises cpp...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 21-06-2004 à 18:44:06    

id, c'est l'identifiant que tu souhaites donner à ta hotkey (une valeur arbitraire)
elle te permettra ensuite de détecter si la hotkey a été pressée via le message WM_HOTKEY (le paramètre wParam contiendra l'id). par exemple, pour détecter si la HotKey n° 1 a été pressée :

Code :
  1. (...)
  2. switch (msg)
  3. {
  4.    case WM_HOTKEY:
  5.       if (msg.wParam == 1)
  6.          MessageBox("La Hot Key 1 a été enfoncée" );
  7.       break;
  8.    case WM_QUIT:
  9.       (...)
  10. }


   


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed