Comment éviter le bip !

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Comment éviter le bip !

Message par brossden »

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 !
Denis

Bonne Jounée à tous
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

Ce n'est pas un parametrage global de Windows ?
Lukky
Messages : 340
Inscription : dim. 25/janv./2004 12:22
Localisation : Morbihan

Message par Lukky »

Bein oui si ça ne l'est pas ça y ressemble beaucoup.

AMHA rien à voir avec pure.

JL
Quand on me gonfle trop j'éclate, sinon ça va !
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai déjà vu une réponse à ce problème sur le forum anglais

mais je ne sais plus où! :?
Invité

Message par Invité »

Je ne vois pas pourquoi les programme ecris avec PureBasic et uniquement ceux-la seraient sujet à un hypothètique paramètre de windows.
Dans le cas ou je me trompe quel paramètre ??
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Par ici :)
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

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.
Denis

Bonne Jounée à tous
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Sinon dernières possibilités:

Faire un Hook clavier
Gérer la procedure du StringGadget pour cet évènement particulier

C'est largement faisable en cherchant un peu.
Invité

Message par Invité »

Ben je suis impatient que tu nous fasse voir, j'ai une passion pour les gens qui disent comment faire mais ne donnent une ligne de code !
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

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) :wink:


A part ça,à qui ai-je l'honneur :!:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

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

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é. :mrgreen:

A part ça, si t'as du code, on prend, on est pas rancunier :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Puisque Fred a dit qu'il était d'accord, il faut obliger les utilisateurs à se logger avant de poster.

Régis,puisque t'est admin! tu dois pouvoir le faire, maintenant!

Chris :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

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:

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.
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

J'ai jamais entendu ce bip, moi :roll:
Z'avez pas un exemple qui bippe? J'aimerais comprendre de quoi vous parlez :oops:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Bonjour nico

J'avoue avoir quelques difficutées à comprendre le fonctionnement de ton code, si tu pouvais commenter un minimum surtout sur la fonction des API ce serait sympa !
Denis

Bonne Jounée à tous
Répondre