Hook clavier

jocou Messages postés 52 Date d'inscription lundi 5 janvier 2004 Statut Membre Dernière intervention 19 novembre 2013 - 19 mars 2009 à 14:48
jocou Messages postés 52 Date d'inscription lundi 5 janvier 2004 Statut Membre Dernière intervention 19 novembre 2013 - 19 mars 2009 à 21:38
Bonjour à tous

Petite question aux spécialistes :

Lorsqu'on positionne un hook clavier local (donc sur un thread particulier), est-ce que :

   - l'appli destinatrice reçoit la touche frappée PENDANT que la procédure du hook fait son traitement

ou bien

   - la procédure du hook exécute son traitement PUIS l'appli destinatrice reçoit la touche frappée

En fait, je voudrais faire la chose suivante :

1) récupérer les touches frappées pour une appli particulière A

2) si la touche est F5, exécuter un traitement AVANT que l'appli A ne reçoive la touche


3) à la fin de mon traitement, laisser l'appli A recevoir la touche F5 et s'exécuter normalement

Est-ce que le HOOK répond à ce mode de fonctionnement, ou bien y-a-t'il d'autres méthodes ?

Merci

jocou

8 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 mars 2009 à 14:55
c'est bien cela...

tu te glisse en fait dans une chaine de hook.

tu recois un message, tu le traite, le transmet au maillon suivant.

en bout de chaine ? ton appli 'A'
0
jocou Messages postés 52 Date d'inscription lundi 5 janvier 2004 Statut Membre Dernière intervention 19 novembre 2013
19 mars 2009 à 15:36
Salut Renfield


Je viens de tester et ça ne se passe pas comme je le voudrais :


Voici la procédure appelée par le hook :








Private



Function
fctCaptureF5(

ByVal
ncode

As



Integer
,

ByVal
wparam

As



Integer
,

ByVal
lparam

As
IntPtr)

As



Integer






if
ncode = 0

Then






   If
GetKeyState(VK_F5) < 0

Then






       MessageBox.Show("Capture écran 3270")






   End If






End



If






Return
CallNextHookEx(hHook, ncode, wparam, lparam)


End



Function


Or, l'appli A traite le F5 AVANT que le msgbox monte à l'écran.

Peux-tu m'éclairer un petit peu ??

Merci






jocou
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 mars 2009 à 15:44
utilises tu bien un WH_KEYBOARD_LL ?

(et puis j'aime pas ton test: If GetKeyState(VK_F5) < 0 Then)
0
jocou Messages postés 52 Date d'inscription lundi 5 janvier 2004 Statut Membre Dernière intervention 19 novembre 2013
19 mars 2009 à 15:51
Voilà exactement ce que je fais :

Private



Const
WH_KEYBOARD_LL

As



Integer
= 13




kbHookProc =




New
HookProc(

AddressOf
fctCaptureF5)


'hHook = SetWindowsHookEx(WH_KEYBOARD_LL, kbHookProc, IntPtr.Zero, 0)

hHook = SetWindowsHookEx(WH_KEYBOARD_LL, kbHookProc, hInstance, 0)





Et toi, qu'est-ce que tu fearis à la place de : If GetKeyState(VK_F5) < 0 Then ?

jocou
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 mars 2009 à 16:25
lis la doc:
http://msdn.microsoft.com/en-us/library/ms644985(VS.85).aspx

ton lParam te les infos sur la touche concernée par le hook :
http://msdn.microsoft.com/en-us/library/ms644967(VS.85).aspx

donc faire:

Private Function fctCaptureF5( ByVal ncode As Integer , ByVal wparam As Integer , ByRef lparam As KBDLLHOOKSTRUCT) As Integer


je pense que le coté synchro de la GetKeyState fais que son etat est à false quand le message te parviens la première fois.
'A' le recoit, l'interprete.
lorsque tu relache la touche, Windows te renvoie un message pour t'en avertir.
a ce moment là, le GetKeyState t'indique que la touche est pressée: tu es en retard sur 'A'
0
jocou Messages postés 52 Date d'inscription lundi 5 janvier 2004 Statut Membre Dernière intervention 19 novembre 2013
19 mars 2009 à 18:14
Private



Function
fctCaptureF5(

ByVal
ncode

As



Integer
,

ByVal
wparam

As



Integer
,

ByRef
lparam

As
KBDLLHOOKSTRUCT)

As



Integer






If
(lparam.flags

And
KBDLLHOOKSTRUCTFlags.LLKHF_UP) = 0

And
lparam.vkCode = 116

Then

MsgBox(lparam.vkCode &




"*"
& lparam.scanCode)


End



If






Return
CallNextHookEx(hHook, ncode, wparam, lparam)


End



Function


pas glop, c'est toujours pareil


As-tu une autre idée ?

jocou
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 mars 2009 à 21:19
et nCode ? tu le testes pas ?

utilises VK_F5, pas 116 (plus lisible)


ton test est pas bon...

(lparam.flags And KBDLLHOOKSTRUCTFlags.LLKHF_UP) = KBDLLHOOKSTRUCTFlags.LLKHF_UP

si le flag est actif
0
jocou Messages postés 52 Date d'inscription lundi 5 janvier 2004 Statut Membre Dernière intervention 19 novembre 2013
19 mars 2009 à 21:38
1) Effectivement, il faut tester le nCode = 0


2) Mea-culpa pour 116, VK_F5 est bien plus lisible


3) Je veux exécuter ma procédure lorsqu'on appuie sur la touche F5 et  la doc que tu m'as indiquée précise:

bit 7 : Specifies the transition state. The value is 0 if the key is pressed and 1 if it is being released.


4) Mais tout cela ne change rien : l'appli A traite toujours la touche F5 avant le msgbox s'affiche.

Que faire ???

jocou
0
Rejoignez-nous