[RESOLU] Les touches de fonctions (F1,F2,Esc,ect...)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

[RESOLU] Les touches de fonctions (F1,F2,Esc,ect...)

Message par omega »

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
Dernière modification par omega le sam. 29/juil./2017 22:02, modifié 1 fois.
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Les touches de fonctions (F1,F2,Esc,ect...)

Message par Micoute »

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 !
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Les touches de fonctions (F1,F2,Esc,ect...)

Message par cage »

Bonjour,
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)
Exemple de code pour gérer les événements:

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
Mais je ne sais si c'est vraiment ce que tu cherches a faire.
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
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

[RESOLU] Re: Les touches de fonctions (F1,F2,Esc,ect...)

Message par omega »

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.

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
Merci beaucoup pour votre précieuse aide
Win7 (x64) 64 bits Pb 5.72
Répondre