Forum Liberty Basic France

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

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 449
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
 
 




Edité par Christophe Le 27/10/2018 à 17h50
____________________
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: 312
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: 1993
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: 449
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: 1993
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: 449
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: 1993
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: 449
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: 1993
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: 449
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 _VK_RETURN : print "Touche "Return" pressée"
            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.

(edit du 28/10 : ajouté la détection de la touche Return, celle dont il est question dans cette discussion et que j'avais oublié dans la liste ;) )



Edité par Christophe Le 28/10/2018 à 08h37
____________________
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 25/10/2018 à 22h39

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 449
Hello !

Voici, par exemple, le bout de code ci-dessous :
Code VB :
 
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 les informations sur la touche appuyée
    long=len(key$)
 
    'si cette info n'a qu'un seul octet, il s'agit d'une touche simple (azert...etc)
    if long=1 then
        a$=key$
        print "1 caractère : touche ";a$
    end if
 
    'si cette info a deux octets, il s'agit d'une touche comme shift, ctrl, pavé numérique, enter, etc...
    if long=2 then
        b$=left$(key$,1)
        c$=right$(key$,1)
        print "2 caractères, touche virtuelle, 1er octet :";b$;" (code ";asc(b$);"), 2d octet : ";c$;" (code ";asc(c$);")"
    end if
 
WAIT
end
 
[quitter]
    close #graph
    end
 
 

En toute logique, à chaque touche appuyée, et quelle qu'elle soit, on s'attendrait à voir réagir une seule des conditions long=1 ou long=2.

Or, à l'exécution du programme, si j'appuie sur la touche "7" du pavé numérique, le programme fait réagir une première fois la condition long=2 (tout à fait normal), puis, de manière très surprenante, la condition long=1.

Tout se passe comme si, pour une seule frappe clavier, on était passé deux fois en Inkey$ : la première fois identifiant une touche virtuelle (_VK_), et la seconde fois affichant le caractère associé à cette _VK_.

Mon JB fonctionne sous Wine/Mageia. Vous qui avez probablement un PC sous Windows, pourriez-vous tester le programme et me dire si vous constatez la même chose ?
____________________
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 26/10/2018 à 12h54

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1993
Citation:
Tout se passe comme si, pour une seule frappe clavier, on était passé deux fois en Inkey$

ça doit être dû au fait que le clavier est divisé en plusieurs zones; il doit y avoir l'identification de zone et l'identification de touche. Le tout dans un but d'économie de câblage. (4 fils pour une centaine de touches.

EDIT: Ah ben non, c'est pas ça
Alors: Compte rendu de ton code pour XP:
1 caractère pour toutes les lettres et assimilées et Enter, esc, esp.
2 caractères pour: ctrl, shift caps, flèches, alt, altgr
Ton mystère perdure et s'épaissit
____________________
Roro

   
Le 26/10/2018 à 20h03

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 449
Oki, quand je l'aurais retrouvé j'allume mon XP pour voir par moi-même. Se pourrait-il que mon Wine me fasse des misères ? ce serait la première fois que j'y trouve un truc aussi rédhibitoire. Car c'est quand même un peu casse-gueule, puisqu'il n'y a pas de lien logique entre la position des instructions dans le listing, et leur exécution.

Par exemple, appuyer sur <Echap>, code ascii 27, fait réagir d'abord la condition long=2, puis la condition long=1 puis à nouveau long=2. Pour nous qui sommes habitués à un développement linéaire du programme, c'est un truc de fou !

J'ai tenté une calculatrice basique où le résultat est calculé quand on appuie sur <Enter>

Il y a une variable "a" qui contient le code ascii correspondant aux touches frappées : 0 à 9, virgule, +,-,*,/. Avec cette exécution "sautillante" due à Inkey$, "a" change de valeur quand on appuie sur <Enter>, d'où la nécessité d'utiliser "nouvela" à un point stratégique tel que la valeur initiale de "a" soit toujours présente dans "nouvela"

On entre un premier nombre, puis l'opérateur, puis le second nombre, et on termine par <enter>

Voici l'oeuvre (ai-je spécifié qu'il faut que la fenêtre "Inkey$ example" soit active, sinon les frappes sont dirigées telles quelles dans la mainwin et le programme ne les capte pas).

Code VB :
 
nombre$=""
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 les informations sur la touche appuyée
    long=len(key$)
 
    if long=1 then
        a=asc(key$)
 
        if a>47 and a<58 or a=46 then 'chiffres et virgule
            nombre$=nombre$+key$
            print nombre$
        end if
 
        if a=42 or a=43 or a=45 or a=47 then    'opérateurs
            nouvela=a   'en fait 'a' change de valeur quand on appuira sur enter...
            gosub [intermediaire]
        end if
 
    end if
 
    if long=2 then
        b=asc(left$(key$,1))
        c=asc(right$(key$,1))
        if b=0 and c=13 then gosub [enter]  'calcule le résultat
        if b=0 and c=27 then goto [quitter]
    end if
 
    wait
 
end
 
[enter]
 
    nombre2=val(nombre$)    'le second nombre est déterminé
    nombre$=""
 
    select case nouvela
        case 42 : result=nombre1*nombre2    'ascii 42=*
        case 43 : result=nombre1+nombre2    'ascii 43=+
        case 45 : result=nombre1-nombre2    'ascii 45=-
        case 47 : result=nombre1/nombre2    'ascii 47=/
    end select
 
    print "="
    print result
    print
 
    return
 
 
[intermediaire]
    nombre1=val(nombre$)    'le premier nombre est déterminé
    nombre$=""
    print chr$(nouvela)     'on affiche l'opérateur
    return
 
[quitter]
    close #graph
    end
 
____________________
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 26/10/2018 à 20h18

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 449
Citation:
Compte rendu de ton code pour XP:
1 caractère pour toutes les lettres et assimilées et Enter, esc, esp.
2 caractères pour: ctrl, shift caps, flèches, alt, altgr
Ton mystère perdure et s'épaissit

Si tout te semble normal sur ton Windows, c'est à coup sûr Wine qui a des soucis avec Inkey$...

Je testerai sur un vrai PC windows ce week-end, mon PC XP n'ayant pas de pavé numérique. Il y a certes une émulation de pavé numérique, mais avec une touche dédiée à maintenir appuyée, et le test n'est pas très concluant.



Edité par Christophe Le 26/10/2018 à 20h21
____________________
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 27/10/2018 à 17h38

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 449
Test avec un Windows 10 : il faut penser à déplacer la fenêtre "Inkey$ example" car elle se case au dessus de la mainwin, juste en haut à gauche, et masque la trace des entrées clavier...

Je cite à nouveau le code pour qu'il n'y ait pas de risque de confusion avec celui de la calculatrice :
Code VB :
 
 
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 les informations sur la touche appuyée
    long=len(key$)
 
    'si cette info n'a qu'un seul octet, il s'agit d'une touche simple (azert...etc)
    if long=1 then
        a$=key$
        print "1 caractère : touche ";a$
    end if
 
    'si cette info a deux octets, il s'agit d'une touche comme shift, ctrl, pavé numérique, enter, etc...
    if long=2 then
        b$=left$(key$,1)
        c$=right$(key$,1)
        print "2 caractères, touche virtuelle, 1er octet :";b$;" (code ";asc(b$);"), 2d octet : ";c$;" (code ";asc(c$);")"
    end if
 
WAIT
end
 
[quitter]
    close #graph
    end
 
 


Voici la saisie de touches sur le pavé numérique, avec un vrai windows (Win10), obtenu par le menu « Fichier, Enregistrer sous...» de la mainwin (le # représente un caractère non affichable) et ajouts de quelques infos pour faciliter la lecture :
Code TXT :
 
Chiffres et opérateurs
1 caractère : touche 1
1 caractère : touche 2
1 caractère : touche 3
1 caractère : touche 4
1 caractère : touche 5
1 caractère : touche 6
1 caractère : touche 7
1 caractère : touche 8
1 caractère : touche 9
1 caractère : touche /
1 caractère : touche *
1 caractère : touche -
1 caractère : touche +
 
Touche <Entrée>
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : 
 (code 13)
1 caractère : touche 
 
Touche <Echap>
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : # (code 27)
1 caractère : touche #
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : # (code 27)
 


J’éditerai le message pour coller le même compte-rendu avec Wine.
Voici les mêmes manips sur mon ordi Mageia/Wine (j'ai légèrement modifié le programme pour ne pas être enquiquiné avec des caractères non imprimables qu'on amènerait sur le traitement de texte puis sur le forum) :
Code TXT :
 
Chiffres et opérateurs
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : ` (code 96)
1 caractère : touche 0
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : a (code 97)
1 caractère : touche 1
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : b (code 98)
1 caractère : touche 2
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : c (code 99)
1 caractère : touche 3
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : d (code 100)
1 caractère : touche 4
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : e (code 101)
1 caractère : touche 5
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : f (code 102)
1 caractère : touche 6
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : g (code 103)
1 caractère : touche 7
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : h (code 104)
1 caractère : touche 8
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : i (code 105)
1 caractère : touche 9
1 caractère : touche /
1 caractère : touche *
1 caractère : touche -
1 caractère : touche +
 
touche <Entrée>
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : # (code 13)
1 caractère : touche 
 
touche <Echap>
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : # (code 27)
1 caractère : touche 
2 caractères, touche virtuelle, 1er octet :# (code 0), 2d octet : # (code 27)
 

La différence avec l’exécution sous Wine concerne juste les touches portant chiffres et opérateurs : sous linux/wine il suffit de ne lire que les inkey$ de un caractère

Par contre les touches <Entrée> et <Echap> génèrent la même salade, que ce soit avec linux/wine ou avec windows. Si on analyse le listing, on ne devrait lire qu’une fois le clavier, et trouver en réponse une seule chaine, soit de 1, soit de 2 octets, mais pas les deux en même temps, plusieurs fois et dans le désordre...

Roland, je ne serais pas surpris que ta première idée sur l'organisation du clavier soit la bonne : s'il y a 3 passages par Inkey$, c'est que la touche pressée devait être l'équivalent de 3 touches. Ce serait la conséquence d'une cuisine interne entre le clavier et sa gestion par l'ordinateur.



Edité par Christophe Le 29/10/2018 à 17h22
____________________
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 27/10/2018 à 19h30

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1993
Citation:
cuisine interne entre le clavier et sa gestion par l'ordinateur

ça c'est sûr que de la cuisine y en a. Je me suis aperçu que le clavier était divisé quand j'ai voulu utiliser un simulateur d'Amstrad il y avait des touches inaccessibles au clavier virtuel customisé, du fait du zonage (encodage).
____________________
Roro

   
Le 29/10/2018 à 17h43

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 449
Je ne sais pas si c'est dû à ce zonage ou à un autre phénomène, mais pour l'utilisation de Inkey$, il faut être sensibilisé à son comportement apparemment erratique mais sûrement bien logique...

Ca ressemble à un problème de gestion des frappes clavier par Just/Liberty, qui n'a pas su les présenter aussi linéairement que sur le listing. Néanmoins, connaissant cette difficulté, on peut utiliser inkey$.

J'ai voulu faire un petit prog qui afficherait les séquences générées par l'appui d'une touche, tout en assurant un minimum de "mise en page" pour rendre le tout plus clair, mais c'est impossible : on ne sait pas quand la série d'évènements générés par une frappe clavier est terminée, donc on ne peut pas passer une ligne entre chaque appui...
____________________
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 et Inkey$ 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