Comment éviter le bip !
Comment éviter le bip !
Bonjour
La frappe de la touche "Entrée" pendant une saisie occasionne un bip, est il possible de supprimer ce bip et de passer automatiquement au champs de saisie suivant.
J'ai écris un bout de code pour cela mais il me semblerait plus logique que le concepteur du languagee l'ait prévu cela d'origine ! Non ?
Merci de vos réponses !
La frappe de la touche "Entrée" pendant une saisie occasionne un bip, est il possible de supprimer ce bip et de passer automatiquement au champs de saisie suivant.
J'ai écris un bout de code pour cela mais il me semblerait plus logique que le concepteur du languagee l'ait prévu cela d'origine ! Non ?
Merci de vos réponses !
Denis
Bonne Jounée à tous
Bonne Jounée à tous
J'ai bien lu le post sur le forum anglais mais ils n'ont trouvé que la même solution que moi en inserrant des lignes de code alors que je trouve ceci des plus illogique !
Dans mon programme j'ai même le passage automatique d'un champs à l'autre lorsque on appuye sur RC par la simulation d'une tabulation.
Dans mon programme j'ai même le passage automatique d'un champs à l'autre lorsque on appuye sur RC par la simulation d'une tabulation.
Denis
Bonne Jounée à tous
Bonne Jounée à tous
T' essayes d'aider les gens, et voilà ce que ça donne....du mépris!
Si tu regardes mes posts, tu verras que j'en donne du code et surtout que j'y passe du temps car comme beaucoup de monde ,je n'ai pas les réponses et que derrière je cherche par ce que ça m'intéresse, que je débute avec Pure Basic et que ça fait moins de trois ans que je programme!
Bon, sinon ça me fait penser que j'ai voté contre le fait que les invités postent du code (en voilà la raison)
A part ça,à qui ai-je l'honneur

Si tu regardes mes posts, tu verras que j'en donne du code et surtout que j'y passe du temps car comme beaucoup de monde ,je n'ai pas les réponses et que derrière je cherche par ce que ça m'intéresse, que je débute avec Pure Basic et que ça fait moins de trois ans que je programme!
Bon, sinon ça me fait penser que j'ai voté contre le fait que les invités postent du code (en voilà la raison)

A part ça,à qui ai-je l'honneur

Moi je me passionne pour les anonymes qui critiquentj'ai une passion pour les gens qui disent comment faire mais ne donnent une ligne de code !

Allez sérieusement, Nico donne de très bons exemples, et il ne faut pas oublier que parfois on pense à quelque chose mais que l'on a pas forcément essayé avec du code.
Ici on essaye de s'entraider simplement, sans obligation et les remarques quelques peu désobligeantes ne sont pas de nature à entrenir ce climat.
On a parfois des mots avec certain(s) (hein Régis) mais on ne prend pas celà au 1er degré.

A part ça, si t'as du code, on prend, on est pas rancunier

Bon je viens de finir!
Ce ne sont que d'éventuelles solutions pour le problème proposé.
En tout cas, les concepts sont intéressants et je ne doute pas que ça puisse resservir.
Dans les deux exemples qui suivent, seul le GadgetId(0) ne subit pas le bip et passe au Gadget suivant!
Le hook clavier:
Modification de l'adresse de procedure du StringGadget pour le traitement de la touche Enter:
Ce ne sont que d'éventuelles solutions pour le problème proposé.
En tout cas, les concepts sont intéressants et je ne doute pas que ça puisse resservir.

Dans les deux exemples qui suivent, seul le GadgetId(0) ne subit pas le bip et passe au Gadget suivant!
Le hook clavier:
Code : Tout sélectionner
Procedure.l Keyboard_Hook(nCode.l, wParam.l, lParam.l)
;Quel que soit le type de hook, La valeur nCode doit toujours être vérifiée
;car si elle est inférieur à 0, il faut passer l'évènement à la procédure
;d'interception suivante.
If nCode < 0
ProcedureReturn CallNextHookEx_(hook, nCode, wParam, lParam)
EndIf
;On récupère le handle de la fenêtre active pour ensuite la comparer
;à notre StringGadget.
hWnd=GetFocus_()
If hWnd=GadgetID(0)
;Le paramètre wparam renvoie le code de la touche
;on teste si c'est la touche Enter($0D)qui vient d'être saisi.
If wParam = $0D
;Le paramètre lparam renvoie différentes informations sur 32 bits(0 à 31)
;Bit 0 à 15 Nombre d'itinérations dû au maintien de la touche enfoncée
;Bit 16 à 23 Code de recherche
;Bit 24 Touche étendue
;Bit 25 à 28 Réservé
;Bit 29 Code du contexte,vaut 1 si touche ALT enfoncée, sinon 0
;Bit 30 Etat précédent de la touche, vaut 1 si enfoncée, vaut 0 relaché
;Bit 31 Etat transitoire, vaut 0 si la touche est en train d'être enfoncée
; vaut 1 si la touche est en train d'être relachée
If lParam & 1073741824 ;(Test du bit 30= 2^30 etat precedent de la touche)
;Simulation de la touche Tab.
keybd_event_($09, 0, 0, 0)
keybd_event_($09, 0, #KEYEVENTF_KEYUP, 0)
EndIf
;Retourner une valeur différente de 0, cela cloture le traitement
;sinon le système traitera l'information
ProcedureReturn 1
EndIf
EndIf
;Tous les autres évènements doivent être transmis à la procédure d'interception
;suivante, et au final à l'application elle-même s'il n'y a plus de hook,
;pour que leurs traitements normal puissent se faire.
ProcedureReturn CallNextHookEx_(hook, nCode, wParam, lParam)
EndProcedure
If OpenWindow(0,0,0,322,275,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"StringGadget Flags") And CreateGadgetList(WindowID(0))
StringGadget(0,8, 10,306,20,"Normal StringGadget...")
StringGadget(1,8, 35,306,20,"1234567",#PB_String_Numeric)
StringGadget(2,8, 60,306,20,"Readonly StringGadget",#PB_String_ReadOnly)
;Hinstance n'est finalement pas nécessaire et peut-être remplacé par 0
hInstance = GetModuleHandle_(0)
;On récupère le numéro d'identification du thread pour les besoins du hook
;cette fonction permet aussi de récupérer le N° du processus
;ici, on en a pas besoin, on peut donc remplacer (@processus) par 0
lpdwProcessId = GetWindowThreadProcessId_(WindowID(), @processus)
Debug processus
hook = SetWindowsHookEx_(#WH_KEYBOARD, @Keyboard_Hook(), hInstance, lpdwProcessId)
Debug "HOOK"+Str(hook)
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_EventGadget
Select EventGadgetID()
Case 0
Debug "Normal StringGadget"
EndSelect
Case #WM_CLOSE
;Clotûre la fonction d'interception.
UnhookWindowsHookEx_(hook)
Quit=1
EndSelect
Until Quit=1
EndIf
Modification de l'adresse de procedure du StringGadget pour le traitement de la touche Enter:
Code : Tout sélectionner
Procedure NouvelleProc( hWnd, msg, wParam, lParam)
;Ici on récupère l'adresse d'origine de la procédure grâce à la
;chaine qui l'identifie: "OriginProc" et le handle de la fenêtre
;voir la fonction SetProp.
OriginProc.l= GetProp_(hWnd, "OriginProc")
Select msg
Case #WM_CHAR
If wParam=$0D
;Simulation de la touche Tab
keybd_event_($09, 0, 0, 0)
keybd_event_($09, 0, #KEYEVENTF_KEYUP, 0)
ProcedureReturn 0
EndIf
EndSelect
;On renvoie tous les autres évènements à la procédure d'origine.
ProcedureReturn CallWindowProc_(OriginProc,hWnd,msg,wParam,lParam)
EndProcedure
If OpenWindow(0,0,0,322,275,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"StringGadget Flags") And CreateGadgetList(WindowID(0))
StringGadget(0,8, 10,306,20,"Normal StringGadget...")
StringGadget(1,8, 35,306,20,"1234567",#PB_String_Numeric)
StringGadget(2,8, 60,306,20,"Readonly StringGadget",#PB_String_ReadOnly)
;Avec cette fonction, on récupère l'adresse d'origine de la procédure
;pour ensuite la restituer, une fois le traitement terminé.
OriginProc = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @NouvelleProc())
;Cette fonction est très utile car elle permet d'associer une nouvelle donnée
;à n'importe quelles fenêtres crées en utlisant une chaine de caractère pour
;l'identification; ça évite d'utiliser une valeur globale.
;Ici on associe la valeur OriginProc identifiée par la chaine "OriginProc"
;au StringGadget
SetProp_(GadgetID(0), "OriginProc", OriginProc)
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_EventGadget
Select EventGadgetID()
Case 0
Debug "Normal StringGadget"
EndSelect
Case #WM_CLOSE
;Supprimer avant fermeture du programme la donnée associée à la fenêtre.
RemoveProp_(GadgetID(0),"OriginProc")
Quit=1
EndSelect
Until Quit=1
EndIf
Dernière modification par nico le mer. 24/mars/2004 19:34, modifié 1 fois.