Controler un programme au clavier
Controler un programme au clavier
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
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
il te faut utiliser les commandes
comme leTAB est deja utilisé il faudra d'abord le "deprogrammer"
avec

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
avec
Code : Tout sélectionner
RemoveKeyboardShortcut(#Fenetre, Raccourci)

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
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 )
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 **
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 )
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
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 ...
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
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.
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.

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.
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.
Droopy,
Une remarque concernant le code que tu as posté sur le Forum Anglais.
Ta procédure est incorrecte:
Il y a des éléments dans ta procédure qui ne servent à rien,
la voici corrigée:
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é:
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.
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
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
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)
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