Bonsoir à tous,
Je pensais trouver une réponse à ma question sur les anciens posts vu la simplicité du sujet, mais hélas, ça fait plus d'une heure que je cherche mais en vain.
Ma question est simple: comment savoir si une touche de fonction est enfoncée? (F1, F2, Esc, Halt etc..) sur une fenêtre window SVP.
Merci
[RESOLU] Les touches de fonctions (F1,F2,Esc,ect...)
[RESOLU] Les touches de fonctions (F1,F2,Esc,ect...)
Dernière modification par omega le sam. 29/juil./2017 22:02, modifié 1 fois.
Win7 (x64) 64 bits Pb 5.72
Re: Les touches de fonctions (F1,F2,Esc,ect...)
Bonjour omega, voici un programme créé par BasicallyPure, j'espère qu'il te sera utile.
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
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Un homme doit être poli, mais il doit aussi être libre !
Re: Les touches de fonctions (F1,F2,Esc,ect...)
Bonjour,
Pour intercepter l'appui d'une touche, on peut utiliser par exemple:Exemple de code pour gérer les événements:
Mais je ne sais si c'est vraiment ce que tu cherches a faire.
cage
Pour intercepter l'appui d'une touche, on peut utiliser par exemple:
Code : Tout sélectionner
AddKeyboardShortcut(#WinApp, #PB_Shortcut_Escape, #MenuAppHide)
AddKeyboardShortcut(#WinApp, #PB_Shortcut_F1 , #MenuAppHelp)
AddKeyboardShortcut(#WinApp, #PB_Shortcut_F2 , #MenuAppFaq)
AddKeyboardShortcut(#WinApp, #PB_Shortcut_F3 , #MenuAppAbout)
Code : Tout sélectionner
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Menu
indexMenu = EventMenu()
If indexMenu = #KeyEnter
; gére l'appui sur Entrée
EndIf
Select indexMenu
Case #MenuAppHelp
; action
Case #MenuAppFaq
; action
Case #MenuAppAbout
; action
EndSelect
EndSelect
ForEver
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
[RESOLU] Re: Les touches de fonctions (F1,F2,Esc,ect...)
Merci à vous deux pour le partage
Pour reprendre le code de Cage, je l'ai légèrement modifié (plus simplifié) et ça marche très bien.
Merci beaucoup pour votre précieuse aide
Pour reprendre le code de Cage, je l'ai légèrement modifié (plus simplifié) et ça marche très bien.
Code : Tout sélectionner
Enumeration
#WinApp
#MenuAppHide
#MenuAppHelp
#MenuAppFaq
#MenuAppAbout
EndEnumeration
OpenWindow(#WinApp, 0,0,500,500, "Test touches de fonction", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
AddKeyboardShortcut(#WinApp, #PB_Shortcut_Escape, #MenuAppHide)
AddKeyboardShortcut(#WinApp, #PB_Shortcut_F1 , #MenuAppHelp)
AddKeyboardShortcut(#WinApp, #PB_Shortcut_F2 , #MenuAppFaq)
AddKeyboardShortcut(#WinApp, #PB_Shortcut_F3 , #MenuAppAbout)
Repeat
EventId=WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
exit=1
EndIf
If EventID = #PB_Event_Menu
Select EventMenu()
Case #MenuAppHide
Debug "Esc"
Case #MenuAppHelp
Debug "F1"
Case #MenuAppFaq
Debug "F2"
Case #MenuAppAbout
Debug "F3"
EndSelect
EndIf
Until exit=1
CloseWindow(#Winapp)
End
Win7 (x64) 64 bits Pb 5.72