c'est d'utiliser les ScanCodes + l'etat des touches Speciales (Alt,Ctrl,Shift )
Code : Tout sélectionner
; Exemple hameçonnage clavier
; écran et ExamineKeyboard () n'est pas nécessaire
; un événement personnalisé est généré lorsqu'une touche est enfoncée
; code de touche virtuelle peut être obtenue avec états Maj, Ctrl et Alt
; par BasicallyPure
; date: 10/13/2014
; OS: windows
; compiler: PB 5.30
; forum topic: http://www.purebasic.fr/english/viewtopic.php?f=12&t=60775
EnableExplicit
Define vKeyCode, scanCode, shiftState, altKeyState, ctrlKeyState, Quit = #False
Define hHookProc ; <--- doit avoir cette procédure pour hameçonnage
#KeyBoard_Event = #PB_Event_FirstCustomValue ; l'hameçonnage génère cet événement sur toute touche pressée
#WinMain = 1
; voici la procédure de rappel de l'hameçonnage
Procedure MyKeyboardHook(nCode, wParam, lParam)
; détache un événement personnalisé (#KeyBoard_Event) quand une touche du clavier est pressée
; informations sur la touche pressée peut être obtenue avec ce qui suit:
; EventData() retourne WPARAM (le code de touche virtuelle).
; EventType() retourne #True si la touche Maj est en pressée lorsque la touche est enfoncée.
; EventGadget() retourne lParam (nombre de répétitions (bits 0-15), le code de balayage (bits 16-23),
; drapeau touche prolongé (24 bits), bits réservés (25-28), le code de contexte (bit 29),
; drapeau touche d'état précédent (bit 30), et le drapeau état-transition (bit 31).
; voir windows 'KeyboardProc callback function' pour plud de détails.
; http://msdn.microsoft.com/en-us/library/windows/desktop/ms644984(v=vs.85).aspx
Shared hHookProc
Static shift, ctrl, alt
Protected vShift, vlParam
If Not (nCode < 0)
If Not lParam & $80000000 ; key down
If wParam = #VK_CONTROL : ctrl + 1 : EndIf
If wParam = #VK_SHIFT : shift + 1 : EndIf
If wParam = #VK_MENU : alt + 1 : EndIf
Select wParam
Case #VK_A To #VK_Z
vShift = Bool(shift > 0) ! (GetKeyState_(#VK_CAPITAL) & 1)
Default
vShift = Bool(shift > 0)
EndSelect
; utilise le bit 25 de vlParam pour l'état touche "CTRL"
vlParam = (lParam & $FDFFFFFF) | (Bool(ctrl > 0) << 25)
Select wParam
Case #VK_SHIFT
If shift < 2 ; éviter la répétition automatique avec shift
PostEvent(#KeyBoard_Event, #WinMain, vlParam, vShift, wParam)
EndIf
Case #VK_CONTROL
If ctrl < 2 ; éviter la répétition automatique avec ctrl
PostEvent(#KeyBoard_Event, #WinMain, vlParam, vShift, wParam)
EndIf
Case #VK_MENU
If alt < 2 ; éviter la répétition automatique avec alt
PostEvent(#KeyBoard_Event, #WinMain, vlParam, vShift, wParam)
EndIf
Default
PostEvent(#KeyBoard_Event, #WinMain, vlParam, vShift, wParam)
EndSelect
Else ; touche Haut
Select wParam
Case #VK_SHIFT : shift = 0
Case #VK_CONTROL : ctrl = 0
Case #VK_MENU : alt = 0
EndSelect
EndIf
EndIf
ProcedureReturn CallNextHookEx_(hHookProc, nCode, wParam, lParam)
EndProcedure
If OpenWindow(#WinMain, 0, 0, 400, 200, "hameçonnage clavier", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
; créer l'hameçonnage
hHookProc = SetWindowsHookEx_(#WH_KEYBOARD, @MyKeyboardHook(), #Null, GetCurrentThreadId_())
StringGadget(0, 10, 10, 100, 25, "")
StringGadget(1, 10, 45, 100, 25, "")
SpinGadget(2, 10, 90, 100, 25, 0, 100, #PB_Spin_Numeric)
ButtonGadget(3, 150, 10, 50, 25, "vider")
EditorGadget(4, 210, 10, 150, 150)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = #True
Case #PB_Event_Gadget
Select EventGadget()
Case 0 :
Case 1 :
Case 2 :
Case 3 : SetGadgetText(4, "") : SetActiveGadget(4)
Case 4 :
EndSelect
Case #KeyBoard_Event ; à cet événement personnalisé
; EventData() donne le code de touche virtuelle
; EventGadget() Bits 16-23 donne le code de balayage
; EventType() donne l'état de la touche shift
; EventGadget() bit 29 donne l'état de la touche alt
; EventGadget() bit 25 donne l'état de la touche ctrl
vKeyCode = EventData() ; obtenir code vKey
scanCode = (EventGadget() & $FF0000) >> 16 ; obtenir code de balayage
shiftState = EventType() ; obtenir état shift
altKeyState = (EventGadget() & $20000000) >> 29 ; obtenir état alt
ctrlKeyState = (EventGadget() & $2000000) >> 25 ; obtenir état ctrl
Debug "virtual key code = " + vKeyCode +
" | scan code = " + scanCode +
" | shift = " + shiftState +
" | Alt = " + altKeyState +
" | ctrl = " + ctrlKeyState
; effectuer une action si touche "Entrée" a été enfoncée alors
; que le gadget de votre choix avait le focus
If vKeyCode = #VK_RETURN
Select GetActiveGadget()
Case 0 : SetActiveGadget(1)
Case 1 : SetActiveGadget(0)
Case 2 : SetGadgetText(2, Str(GetGadgetState(2))) ; spin gadget
EndSelect
EndIf
EndSelect
Until Quit = #True
; supprimer l'hameçonnage
UnhookWindowsHookEx_(hHookProc)
EndIf
; Epb