Page 1 sur 2
Controler un programme au clavier
Publié : sam. 10/sept./2005 17:03
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
Publié : sam. 10/sept./2005 17:34
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

Publié : sam. 10/sept./2005 18:02
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 )
Publié : sam. 10/sept./2005 18:26
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.
Publié : sam. 10/sept./2005 19:48
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

Publié : sam. 10/sept./2005 20:08
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
Publié : sam. 10/sept./2005 20:44
par Droopy
Merci beaucoup, je vais essayer de mettre tout ça dans une librairie .
Thanks a lot Nico

Publié : sam. 10/sept./2005 21:50
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 ...
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
Publié : sam. 10/sept./2005 22:52
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.

Publié : sam. 10/sept./2005 23:08
par Droopy
Tu as raison nico, j'intègre ça à la Droopy Lib
A+
Publié : dim. 11/sept./2005 12:39
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.
Publié : dim. 11/sept./2005 21:42
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.
Publié : lun. 12/sept./2005 9:57
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
Publié : lun. 12/sept./2005 16:31
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?

Publié : mer. 14/sept./2005 18:35
par Droopy
désolé j'étais absentt, je poste sur le forum anglais, merci