Controler un programme au clavier

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Controler un programme au clavier

Message par Droopy »

Je décrit ce que je n'arrive pas à faire:

Deux boutons dans une fenètre.
Je peut changer le bouton actif avec TAB.

Je veux qu'en pressant ENTER le code associé au bouton actif soit exécuté ( le même code que quand l'on clique )

But :
Pouvoir controler une application PureBasic sans souris .

voili voila
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

il te faut utiliser les commandes

Code : Tout sélectionner

 event_menu= EventMenuID()
  

  AddKeyboardShortcut(#Window_0, #PB_Shortcut_Control | #PB_Shortcut_Tab, #tabulation)
  
  ; TABULATION !!!
  If Event= #PB_Event_Menu
    If EventMenuID()=#tabulation ; ctrl+tab
...
.....
.


endif
endif




comme leTAB est deja utilisé il faudra d'abord le "deprogrammer"
avec

Code : Tout sélectionner

RemoveKeyboardShortcut(#Fenetre, Raccourci)
:D
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Merci Dobro, j'avais essayé avec AddKeyboardShortcut mais j'ai trouvé ça un peu compliqué.

J'ai presque trouvé ce que je voulais avec ce code

Code : Tout sélectionner

Select WaitWindowEvent()
Case #WM_KEYDOWN  
      
If EventwParam()=#VK_RETURN And GetFocus_()=GadgetID(#PowerOff)
** ICI LE CODE A EXECUTER **
1° On détecte qu'une touche est pressée
2° On teste que c'est la touche ENTER qui est pressée
3° On teste que le Gadget est activé

Le seul problème est qu'il faut saisir deux fois le code à exécuter : une fois après ce code / une fois après la gestion normale des évènements ( Le même problème se pose avec AddKeyboardShortcut )
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Si tu postes un message, tu n'auras pas besoin de copier le code.

Je ne me suis pas pencher dessus alors je n'ai pas de code.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

nico a écrit :Si tu postes un message, tu n'auras pas besoin de copier le code.

Je ne me suis pas pencher dessus alors je n'ai pas de code.
ça veut dire qu'il faut que j'utilise la fonction Sendmessage_
ou que je poste un code d'exemple :?:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Droopy, je viens de faire ce code pour l'exemple.

Code : Tout sélectionner

  Enumeration
    #Window
    #BOUTON1
  EndEnumeration
  
  
  If OpenWindow(#Window,0,0,400,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Pure Basic")
    CreateGadgetList(WindowID(#Window))
    Hwnd=StringGadget(0,8, 10,255,20,"Normal StringGadget...")
    ButtonGadget(1,10,50,100,20,"Bouton 1")
    ButtonGadget(2,10,90,100,20,"Bouton 2")
  
    Repeat
      EventID.l=WaitWindowEvent()
      Select EventID 
        Case #PB_EventGadget
          Select EventGadgetID()
            Case 1
              Select EventType()
                Case #PB_EventType_LeftClick
                  MessageRequester("Info", "#PB_EventType_LeftClick 1")
                  
                Case #PB_EventType_RightClick
                  MessageRequester("Info", "#PB_EventType_RightClick 1")
              EndSelect
              
            Case 2
              Select EventType()
                Case #PB_EventType_LeftClick
                  MessageRequester("Info", "#PB_EventType_LeftClick 2")
                  
                Case #PB_EventType_RightClick
                  MessageRequester("Info", "#PB_EventType_RightClick 2")
              EndSelect
          
          EndSelect 
          
      Case #WM_KEYDOWN  
        Select EventwParam()
          Case #VK_RETURN
            handle=GetFocus_()
            tampon.s=Space(7)
            GetClassName_(handle,@tampon,Len(tampon))
            If Tampon="Button"
            ;/ PostMessage_(window, message, lparam, wparam)
            ;/ le Hiword de lparam est la notification
            ;/ le LoWord de lparam est l'id du gadget
            ;/ wparam est le Handle du Gadget
            ; ici #PB_EventType_LeftClick représente la notification, on peut s'en passer
            ;/ et mettre 0
            ;/ Je ne remplie pas le LoWord de lparam puisque ce n'est pas utile
            ;/ sinon il suffit de faire: #PB_EventType_LeftClick<<16 | GetDlgCtrlID_(handle)
              PostMessage_(WindowID(#window),#WM_COMMAND,#PB_EventType_LeftClick<<16,handle)
            EndIf 
        EndSelect  
            
        Case #WM_CLOSE
          quit=1
      EndSelect 
    Until quit=1 
  EndIf    
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Merci beaucoup, je vais essayer de mettre tout ça dans une librairie .

Thanks a lot Nico :D
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Ce code fonctionne bien pour les boutons, mais mal pour la checkbox via le clavier .

De plus j'ai remarqué que pour activer un bouton / activer la checkbox au clavier c'est la touche ESPACE qu'il faut presser !!

Est-ce normal / Peut on changer ceci ?

En bref :
Vu que la touche Espace permet d'activer un gadget, je me rend compte que je me suis bien pris la tête pour rien ... :x

Code : Tout sélectionner

;/ Simulate a click ( or other event ) when a gadget has the focus / User press RETURN
;/ Author: Nico & Droopy

#Window_0=0
#Button_0=1
#Button_1=2
#CheckBox_0=3


ProcedureDLL ReturnKeyToGadgetEvent(Window,Gadget,WichEvent)
  If EventwParam()=#VK_RETURN And GetFocus_()=GadgetID(Gadget)
    handle=GetFocus_() 
    buffer.s=Space(255) 
    GetClassName_(handle,@buffer,Len(buffer)) 
    PostMessage_(WindowID(Window),#WM_COMMAND,WichEvent<<16,handle) 
  EndIf
EndProcedure 

OpenWindow(#Window_0, 216, 0, 130, 131,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar |#PB_Window_ScreenCentered, "Return Test")
CreateGadgetList(WindowID())
ButtonGadget(#Button_0, 10, 10, 110, 40, "OK")
ButtonGadget(#Button_1, 10, 60, 110, 40, "CANCEL")
CheckBoxGadget(#CheckBox_0, 10, 110, 110, 20, "Choice 1")
ActivateGadget(#Button_0)

Repeat
  
  Select WaitWindowEvent()
    
    ;/ Manage Event when user press RETURN key
    Case #WM_KEYDOWN
      ReturnKeyToGadgetEvent(#Window_0,#Button_0,#PB_EventType_LeftClick )
      ReturnKeyToGadgetEvent(#Window_0,#Button_1,#PB_EventType_LeftClick )
      ReturnKeyToGadgetEvent(#Window_0,#CheckBox_0,#PB_EventType_LeftClick )
      
      ;/ Manage Gadget event 
    Case #PB_Event_Gadget 
      Select EventGadgetID()
        
        Case #Button_0
          Beep_(400,250)
          
        Case #Button_1
          Beep_(800,250)
          
        Case #CheckBox_0
          Beep_(1200,250)
         
      EndSelect
      
    Case #WM_CLOSE 
      End
      
  EndSelect
ForEver
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Le code que j'ai donné n'est pas prévu pour fonctionner pour les Checkbox, option et autres gadgets; cela dit il pourrait le faire mais faut adapter le code à chaque cas.

Vu que cela fonctionne bien avec la barre d'espace, autant le garder.

Cela dit le code que j'ai donné est plus qu'utile, car comme tu le sais, toutes les boites de dialogues acceptent naturellement la touche Enter pour la validation des boutons. Et comme Pure Basic ne sais pas créer de boites de dialogue, et que l'on est obligé donc de les simuler, la touche Enter ne fonctionnera pas sans ce code.

Donc c'est plutôt utile. :)
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Tu as raison nico, j'intègre ça à la Droopy Lib

A+
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Bonjour,

Pour un CheckBox, c normal. On ne peut en changer l'état qu'avec Espace (dans les standards de Windows). Mais pour les boutons, par contre, dans toutes les applications qui contiennent des boutons, on peut les activer avec Entrée. Il y a plain de petites choses qui changent, par exemple avec les OptionGadget. Normalement, on devrait pouvoir se déplacer dans une liste de boutons radio avec les flèches (sous 98 dans la boîte Arrêt de Windows, quand on fait les flêches et que l'on est sur un bouton radio, on en change par exemple). Pour les PanelGadget, les raccourcis Ctrl+Tab et Ctrl+Shift+Tab sont standards pour changer d'onglet. Mais tout ça n'est pas dans PB... je me suis souvent pausé la question.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Droopy,

Une remarque concernant le code que tu as posté sur le Forum Anglais.

Ta procédure est incorrecte:

Code : Tout sélectionner

ProcedureDLL ReturnKeyToButtonClick2(Window,ButtonGadget) 
  If EventwParam()=#VK_RETURN And GetFocus_()=GadgetID(ButtonGadget) 
    handle=GetFocus_() 
    buffer.s=Space(255) 
    GetClassName_(handle,@buffer,Len(buffer)) 
    PostMessage_(WindowID(Window),#WM_COMMAND,#PB_EventType_LeftClick<<16,handle) 
  EndIf 
EndProcedure 
Il y a des éléments dans ta procédure qui ne servent à rien,
la voici corrigée:

Code : Tout sélectionner

ProcedureDLL ReturnKeyToButtonClick(Window,ButtonGadget) 
  If EventwParam()=#VK_RETURN And GetFocus_()=GadgetID(ButtonGadget) 
    PostMessage_(WindowID(Window),#WM_COMMAND,#PB_EventType_LeftClick<<16,GadgetID(ButtonGadget)) 
  EndIf 
EndProcedure 
Il faudrait peut être prévoir une fonction qui permette aussi d'utiliser la touche enter sur tout les boutons sans devoir les déclarer ce que faisait normalement le code original que j'avais posté:

Code : Tout sélectionner

ProcedureDLL ReturnKeyToButtonClick(Window,ButtonGadget) 
  If ButtonGadget>-1
    If EventwParam()=#VK_RETURN And GetFocus_()=GadgetID(ButtonGadget) 
      PostMessage_(WindowID(Window),#WM_COMMAND,#PB_EventType_LeftClick<<16,GadgetID(ButtonGadget)) 
    EndIf
  Else
    handle=GetFocus_() 
    buffer.s=Space(255) 
    GetClassName_(handle,@buffer,Len(buffer))
    If buffer="Button"
      PostMessage_(WindowID(Window),#WM_COMMAND,#PB_EventType_LeftClick<<16,handle) 
    EndIf
  EndIf 
EndProcedure 

Ainsi en déclarant -1, tous les boutons de la fenêtres spécifiée sont sensible à la touche Enter sans devoir les déclarer. Ce qui est plus logique dans le cas d'une boite de dialogue.

Code : Tout sélectionner

    Case #WM_KEYDOWN 
      ReturnKeyToButtonClick(#Window_0,-1) 
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Je pense que c'est corrigé, qu'en pense-tu nico

Code : Tout sélectionner

;/ Simulate a left click when you press ENTER over an activated Button
;/ Author: Nico & Droopy 

#Window_0=0 
#Button_0=1 
#Button_1=2 

ProcedureDLL ReturnKeyToButtonClick(Window) 
  If EventwParam()=#VK_RETURN
    handle=GetFocus_() 
    buffer.s=Space(255) 
    GetClassName_(handle,@buffer,Len(buffer)) 
    If buffer="Button" 
      PostMessage_(WindowID(Window),#WM_COMMAND,#PB_EventType_LeftClick<<16,handle) 
    EndIf 
  EndIf
EndProcedure 

OpenWindow(#Window_0, 216, 0, 130, 111,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar |#PB_Window_ScreenCentered, "Return Test") 
CreateGadgetList(WindowID()) 
ButtonGadget(#Button_0, 10, 10, 110, 40, "OK") 
ButtonGadget(#Button_1, 10, 60, 110, 40, "CANCEL") 
ActivateGadget(#Button_0) 

Repeat 
  
  Select WaitWindowEvent() 
    
    ;/ Manage Event when user press RETURN key 
    Case #WM_KEYDOWN
      ReturnKeyToButtonClick(#Window_0) 
      
      ;/ Manage Gadget event 
    Case #PB_Event_Gadget 
      Select EventGadgetID() 
        
        Case #Button_0
          Beep_(400,250) 
          
        Case #Button_1 
          Beep_(800,250) 
          
      EndSelect 
      
    Case #WM_CLOSE 
      End 
      
  EndSelect 
ForEver
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Oui, je pense que c'est mieux de le laisser dans sa forme la plus simple.

Tu mets à jour sur le Forum Anglais?

:)
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

désolé j'étais absentt, je poste sur le forum anglais, merci
Répondre