Forum Liberty Basic France

Général » Password.bas lire les évènements clavier
Le 09/09/2018 à 00h56

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 437
Bonjour,

password.bas est un code exemple situé dans le dossier d'installation du Basic. Il permet d'entrer un mot de passe dans une petite fenêtre de connexion, et les caractères entrés seront remplacés par des astérisques.

Je l'ai trouvé surprenant à plus d'un titre : par exemple, la saisie des caractères s'appuie sur une graphicbox, dont la particularité est d'être invisible : elle n'est donc vraiment là que pour la saisie des touches qu'on tape.

Donc la question qui vient à l'esprit : pourquoi diable a-t-on besoin d'une graphicbox pour saisir une frappe clavier ? N'a-t-on pas des instructions dédiées ?

Dans l'aide, chapitre "Reading Mouse Events and Keystrokes", paragraphe "Using Virtual Key Constants", on apprend que :
"Les entrées clavier peuvent seulement êtres capturées en fenêtre graphique ou en graphicbox. Quand une touche est pressée, l'information est stockée dans la variable Inkey$. Pour vérifier s'il y a des touches pressées, utiliser la commande "when characterInput [branchLabel]" sur une fenêtre graphique ou une graphicbox, et évaluer Inkey$ dans le sous-programme désigné"

En clair, à chaque appui sur une touche, le programme file sur [branchLabel], où se trouve la routine qu'on a programmé pour décortiquer Inkey$ et en déduire le caractère ou la touche appuyée.

Mais alors pourquoi les instructions qui s'occupent de texte, comme textbox, combobox, texteditor, etc... existent, puisqu'il faut passer par Inkey$ et une graphicbox pour saisir une frappe clavier ? A priori, parce que tout ce qu'on tape au clavier dans un texteditor est simplement interprété par le texteditor, et lui seul : si j'appuie sur la touche "retour", le texteditor passera à la ligne, comme n'importe quel traitement de texte, et c'est tout.

Si je veux intercepter cet "enter" pour autre chose qu'un affichage de texte, par exemple pour valider une saisie sans avoir besoin de quitter le clavier et d'attraper la souris pour cliquer sur "ok", il faut passer par Inkey$ et la fenêtre graphique ou la graphicbox.

On a donc à notre disposition deux modes d'utilisation du clavier, un pour afficher du texte, et l'autre pour saisir l'appui sur des touches qui peuvent représenter autre chose qu'un caractère.

Voici le code (chez moi, la gestion de la touche "retour arrière" fonctionne mal). A vos commentaires, en attendant que j'ajoute les miens :
Code VB :
 
'This program is an example contributed by a Liberty BASIC community member.
'PASSWORD EXAMPLE WITH A MASK
'by laz on April 1, 2002

'password protect your programs with this simple password screen
'the password is masked with the asterisk you can change the mask
'to what ever you want. You can also use the backspace key to delete
'a charcter. You can use the enter key to press the Ok button after
' you enter the password
'
'you can remove the ok button and put all the timers to 10
'"timer 10, [t]" the just use the enter key to enter password
'
'the password in this example is "ok"
nomainwin
enter$ = chr$(_VK_RETURN) : backspace$ = chr$(_VK_BACK)
bs = 2 'for some reason when you press the
'backspace key it shows up twice and
'deletes two charcters. This is used
'as a counter so the backspace only
'deletes one charcter at a time
'** if anyone knows how to fix this please
'** post it to the group. Thanks

WindowWidth = 285 : WindowHeight= 130
'center the window
UpperLeftX = (DisplayWidth-WindowWidth)/2
UpperLeftY = (DisplayHeight-WindowHeight)/2
 
'graphicbox is used to capture key input
graphicbox #pass.gb, 0,0,0,0
textbox #pass.tb, 1,20,275,25
'ok button optional
button #pass.default, "Ok", [ok],UL 100,60,70,25
open "Enter Password" for window as #pass
print #pass, "trapclose [quitpass]"
print #pass, "font courier_new 10 bold"
print #pass.gb, "setfocus"
print #pass.gb, "when characterInput [letter]"
timer 400, [t]
wait
 
[t]
'if enter = 1 the enter key was pressed
if enter = 1 then timer 0 : goto [ok]
print #pass.gb, "setfocus"
wait
 
[letter]
timer 0
key$ = Inkey$ : key$ = left$(Inkey$, 2) : vkey$ = right$(key$,1)
if vkey$ <> enter$ and vkey$ <> backspace$ then
b$ = b$ + key$ : b = len(b$) : fill$ = ""
for x = 1 to b:fill$ = fill$ + "*" : next x 'fill mask with "*"
print #pass.tb, fill$ : print #pass.gb, "setfocus"
end if
if vkey$ = enter$ then enter = 1
if vkey$ = backspace$ and bs = 2 then
b = len(b$) : b=b-1 : b$ = left$(b$,b) : fill$ = ""
for x = 1 to b : fill$ = fill$ + "*" : next x 'fill mask with "*"
print #pass.tb, fill$ : print #pass.gb, "setfocus"
bs = bs +1: if bs = 3 then bs = 1 else if bs = 1 then bs = 2
end if : timer 400, [t]
wait
 
[quitpass]
timer 0
close #pass
end
 
[ok]
timer 0
if b$ = "ok" then 'password is "ok"
'do events for correct password
notice " " + chr$(13) + "Correct password" : print #pass.tb, ""
print #pass.gb, "setfocus" : b$ = ""
enter = 0 'leave timer off if opening a new window "timer 0"
timer 400, [t]
else
'do events for wrong password
notice " " + chr$(13) + "Wrong Password!" : print #pass.tb, ""
print #pass.gb, "setfocus" : b$ = "" : enter = 0 : timer 400, [t]
end if
wait
 
 
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 09/09/2018 à 13h14

Modérateur

Groupe: Modérateur

Inscrit le: 30/03/2011
Messages: 298
je me demande pk tu met ce code ici XD
____________________
Yo !

MSN Web    
Le 09/09/2018 à 14h51

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1968
Citation:
je me demande pk tu met ce code ici XD

Parce que ton message du: 06/09/2018 à 12h34 dans: http://libertybasic.fr/forum/topic-515+sortie-de-justbasic-2-0.php a
Aurait dû faire l'objet d'un nouveau thread dans: "Débutant" (qui est spécialement dédiée aux questionnements).
Sinon, tu fait monter le niveau du bordel ambiant.
Mais on t'aime quand même :)

Edit: Pour répondre à ça: Citation:
ben si... si tu met toto en nom et que trois semaines plus tard un mec se nomme toto le fichier sera le même XD
de l'autre thread:
Ben non; car il te suffira de chercher dans les noms si le nouveau proposé n'est pas déjà présent; et de renvoyer une notice demandant de choisir un autre nom.
Et donc: Plus besoin de mot des passe. (y a rien de plus chiant que les mots de passe)
____________________
Roro

   
Le 10/09/2018 à 14h12

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 437
C'est vrai que nous pratiquons volontiers la glissade plus ou moins contrôlée. Il n'y a pas de conséquence parce que notre forum ressemble à un patelin qui voit passer trois voitures par jour, mais ce serait mieux, en effet, que chaque thème développé suive le titre de la discussion et que les digressions restent brèves.

En ce qui concerne l'actuelle discussion, c'est aussi parce qu'à une époque je n'ai pas su saisir une touche "enter" pour valider une entrée. En fait, ce n'est pas une question pour débutant, parce qu'en plus de devoir ouvrir un objet graphique, il faut aussi mettre des temporisation. Un truc de fou pour lire une touche frappée...
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 10/09/2018 à 15h26

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1968
Citation:
ce n'est pas une question pour débutant

A défaut de voir apparaître des rubriques: "Confirmés" et: "Experts"; autant mettre les question dans: "Débutant".
____________________
Roro

   
Le 10/09/2018 à 22h33

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 437
Autrement dit : je ne prétend pas expliquer aux débutants la saisie de touches avec Inkey$ obligatoirement associé à un objet graphique et une instruction "timer" ou "scan". Cette association n'est pas intuitive et elle mérite discussion, d'où sa présence dans la rubrique "Général".

A+ (l'est trop tard ce soir pour que je planche sur le sujet)
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 11/09/2018 à 01h15

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1968
Citation:
d'où sa présence dans la rubrique "Général"

Ce qui est bien avec "général", c'est que c'est général. (Lao Tse...?
____________________
Roro

   
Le 11/09/2018 à 21h05

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 437
Tout à fait, mon colonel ! ;)

l'explication de SCAN dans le manuel :
The SCAN statement causes Just BASIC to stop what it is doing for a moment and process Windows keyboard and mouse messages. This is useful for any kind of routine that needs to run continuously but which still needs to process user events such as button clicks and other actions. In this way, SCAN can be used as an INPUT statement that doesn't stop and wait.

Et la même chose en français, si je me goure pas dans ma traduction (tu ne m'avait pas dit un jour qu'il y avait une traduction française ? ) :
L'instruction SCAN arrête un moment Just Basic dans ce qu'il était en train de faire, pour procéder à la lecture des messages clavier et souris de Windows. C'est commode pour toute sorte de routines nécessitant de tourner constamment mais qui ont aussi besoin de gérer les évènements créés par l’utilisateur, comme un clic sur un bouton ou d'autres actions. De cette manière, SCAN peut être utilisée comme une instruction INPUT qui ne s'arrête pas en attente (de la réponse de l'utilisateur, ndt)



Edité par Christophe Le 11/09/2018 à 21h05
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 12/09/2018 à 01h18

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1968
Citation:
L'instruction SCAN arrête un moment Just Basic dans ce qu'il était en train de faire

Je ne pense pas qu'on puisse dire qu'il "s'arrête".
C'est comme si on disait qu'un pc s'arrête pour interroger ses entrées; mais on peut dire qu'il ne fait pas autre chose; ça s'arrête quand on coupe l'alimentation (sauf l'horloge).
____________________
Roro

   
Le 12/09/2018 à 21h52

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 437
C'est fou ce qu'on aime chipoter, nous deux. Un vrai vieux couple^^ Alors, bon, d'accord, le programme arrête ce qu'il était en train de faire, pour porter son attention sur les entrées clavier et souris, avant de reprendre ce qu'il faisait. Est-ce mieux ? ;)

L'exemple "password" utilise des timers : sûrement pour permettre au matériel ou au programme de réagir lors de l'appui d'une touche, mais on ne sait pas quelle durée leur attribuer, et cette durée varie probablement avec les performances du système, ce n'est donc pas une astuce viable.

Toujours dans la recherche de la saisie facile de toutes les touches du clavier (pour pouvoir valider son mot de passe par un "Return/Entrée", par exemple) avec Inkey$ et le clavier virtuel :

Code VB :
    'd'après l'aide, "Using virtual key constants with Inkey$",
    'exemple "INKEY.BAS  - how to use the Inkey$ variable"
    '
    'si rien ne s'affiche en mainwin lorsqu'on frappe les touche, cliquer dans
    'la fenêtre graphique (la petite fenetre devant la mainwin)

open "Inkey$ example" for graphics as #graph
    print #graph, "trapclose [quitter]"
    print #graph, "when characterInput [fetch]"
    print #graph, "setfocus"
wait
 
[fetch]  'a character was typed!

    key$ = Inkey$   'Inkey$ contient le code de la touche appuyée

    'analyse du contenu de Inkey$ :
    'longueur
    print "longueur Inkey$ :";len(key$);" oct. : ";
 
    'contenu en code ascii
    for a= 1 to len(key$)
    print asc(mid$(key$,a,1));" ";
    next
    print " -> ";
 
    'Inkey$ avec un octet est une touche correspondant à une lettre ou un symbole
    'à deux octets, il correspond à une touche de fonction
    if len(key$) = 1 then
        'inkey$ a un seul octet
        print key$+" was pressed!"
        if key$="q" or key$="Q" then print "touche q frappée, fin du programme":goto [quitter]
    else
        'inkey$ a deux octets (ou zéro, ou plus de 1 ^^)
        keyValue = asc(right$(key$, 1))
        select case keyValue
            case _VK_F1 : print "touche F1"
            case _VK_F2 : print "touche F2"
            case _VK_F3 : print "touche F3"
            case _VK_F4 : print "touche F4"
            case _VK_F5 : print "touche F5"
            case _VK_F6 : print "touche F6"
            case _VK_F7 : print "touche F7"
            case _VK_F8 : print "touche F8"
            case _VK_F9 : print "touche F9"
            case _VK_F10 : print "touche F10"
            case _VK_F11 : print "touche F11"
            case _VK_F12 : print "touche F12"
            case _VK_F13 : print "touche F13"
            case _VK_F14 : print "touche F14"
            case _VK_F15 : print "touche F15"
            case _VK_F16 : print "touche F16"
            'case _VK_0 : print "chiffre 0 sur clavier"
            'case _VK_1 : print "chiffre 1 sur clavier"
            'case _VK_2 : print "chiffre 2 sur clavier"
            'case _VK_3 : print "chiffre 3 sur clavier"
            'case _VK_4 : print "chiffre 4 sur clavier"
            'case _VK_5 : print "chiffre 5 sur clavier"
            'case _VK_6 : print "chiffre 6 sur clavier"
            'case _VK_7 : print "chiffre 7 sur clavier"
            'case _VK_8 : print "chiffre 8 sur clavier"
            'case _VK_9 : print "chiffre 9 sur clavier"
            case _VK_NUMPAD0 : print "chiffre 0 sur pavé numérique"
            case _VK_NUMPAD1 : print "chiffre 1 sur pavé numérique"
            case _VK_NUMPAD2 : print "chiffre 2 sur pavé numérique"
            case _VK_NUMPAD3 : print "chiffre 3 sur pavé numérique"
            case _VK_NUMPAD4 : print "chiffre 4 sur pavé numérique"
            case _VK_NUMPAD5 : print "chiffre 5 sur pavé numérique"
            case _VK_NUMPAD6 : print "chiffre 6 sur pavé numérique"
            case _VK_NUMPAD7 : print "chiffre 7 sur pavé numérique"
            case _VK_NUMPAD8 : print "chiffre 8 sur pavé numérique"
            case _VK_NUMPAD9 : print "chiffre 9 sur pavé numérique"
            case _VK_MENU : print "touche Alt"
            case _VK_SHIFT : print "Shift was pressed"
            case _VK_HOME : print "touche Home"
            case _VK_END : print "touche End"
            case _VK_INSERT : print "touche Insert"
            case _VK_DELETE : print "touche Delete"
            case _VK_NUMLOCK : print "touche Num. Lock"
            case _VK_UP : print "touche Flèche haut"
            case _VK_UP : print "touche Flèche bas"
            case _VK_UP : print "touche Flèche gauche"
            case _VK_UP : print "touche Flèche droite"
            case _VK_CONTROL : print "Ctrl was pressed"
            case else : print "Unhandled key pressed"
        end select
     end if
 
WAIT
 
[quitter]
    close #graph
    end
 
 


Certaines touches ont un code à l'enfoncement et un code au relâchement.

Curieusement, dans cet exemple il n'y a pas de scan ni de timer. Cependant... faut rester logique : il n'a rien d'autre à gérer.
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Général » Password.bas lire les évènements clavier  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie