Inkey() et KeyboardInkey()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
jak64
Messages : 85
Inscription : dim. 03/mai/2020 23:16

Inkey() et KeyboardInkey()

Message par jak64 »

Bonjour à toutes et tous,
Je souhaite utiliser l'équivalent de la fonction Inkey() ou KeyboardInkey() mais uniquement avec une fenêtre Windows.

1) Inkey() ne fonctionne qu'en mode Console
2) KeyboardInkey() exige d'avoir une fenêtre OpenScreen() ou OpenWindowScreen()

Or je ne veux avoir qu'une fenêtre OpenWindow()

Comment saisir un caractère à la volée dans ce cas ?

Merci pour votre aide.
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Inkey() et KeyboardInkey()

Message par Marc56 »

Bonsoir jak64,

Soit tu réaffecte tout le clavier avec AddKeyboardShortcut() le temps de la saisie.
Soit tu analyse la dernière lettre saisie dans un gadget à chaque changement (#PB_EventType_Change) sur un gadget.

:wink:
Avatar de l’utilisateur
jak64
Messages : 85
Inscription : dim. 03/mai/2020 23:16

Re: Inkey() et KeyboardInkey()

Message par jak64 »

Bonjour marc56,
Merci de ta réponse, cela me confirme donc qu'il n'y a pas d'équivalent Inkey() pour une fenêtre Windows.
Je vais donc me rabattre en créant une fenêtre OpenWindowedScreen(), ce sera le plus simple pour ce que je veux faire.
Bonne soirée
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Inkey() et KeyboardInkey()

Message par Ollivier »

@jak64

Marc56, que je salue est fatigué : soit ci, soit ça.

Ça manque d'une tonalité ouverte, laissant libre l'esprit de quêter.
T'as d'autres méthodes : Dans ce topic, j'avais publié une API Windows. En une seule fonction, t'as tout le clavier, les boutons de souris compris. C'était il y a 14 ans. Avec la fascination d'avoir cherché sans imaginer être surpris par Flype qui connaissait cette API avec 4 ans d'avance.

Si tu veux être multi-plateforme (Windows+Linux), tu peux aussi créer un canvas d'un pixel : il y a tous les états de touches disponibles en temps réel, ceux de la souris y compris, la molette y compris. Comme ton canvas fait un pixel, ça ne bouffe pas de ressources.

J'adore le "screen" mais si tu as commencé un projet avec la GUI du bureau, et que tu intègres un screen fenêtré uniquement pour ça, ça perdra le bon sens de Purebasic : faire des exécutables légers avec le moins possible de fichiers dépendants. Ça peut démotiver.

Tu prends la doc et tu trouves les extraits suivant :

Code : Tout sélectionner

#PB_EventType_Focus           : Le gadget a obtenu le focus clavier
  #PB_EventType_LostFocus       : Le gadget a perdu le focus clavier
  #PB_EventType_KeyDown(*)      : Une touche clavier a été pressée 
  #PB_EventType_KeyUp(*)        : Une touche clavier a été relâchée 
  #PB_EventType_Input(*)        : Du texte a été entré dans le gadget
KeyUp et KeyDown sont affiliés à un scancode clavier :

Code : Tout sélectionner

 - #PB_Canvas_Key  : Renvoie la touche du clavier qui a été enfoncée ou relâchée après un évènement #PB_EventType_KeyDown ou un évènement #PB_EventType_KeyUp et 
                      la valeur retournée est l'une des constantes #PB_Shortcut_ ... qui sont utilisées par la fonction AddKeyboardShortcut(). 
                      Note: Cet attribut renvoie la première touche pressée. 
                      Note: Pour obtenir un texte saisi au clavier dans le Canvasgadget, il est préférable d'utiliser l'évènement #PB_EventType_Input 
                            avec l'attribut #PB_Canvas_Input, car il permet la saisie de texte à partir d'une combinaison de plusieurs touches telles 
                            que la touche 'Shift' et autres touches muettes.
Conclusion : soit canvas_key pour un scancode clavier (tu veux capter une ou plusieurs touches spécifiques);
Soit canvas_input pour une saisie clavier : la touche A te renvoie un A etc...

@marc56

Désolé d'être casse-grelot.
Avatar de l’utilisateur
jak64
Messages : 85
Inscription : dim. 03/mai/2020 23:16

Re: Inkey() et KeyboardInkey()

Message par jak64 »

Bonjour Olivier,
Merci pour ton message mais comme je ne pratique Purebasic que depuis quelques mois, je n'ai pas compris.
J'ai copié le code de ton topic dans l'éditeur de Purebasic et, quand je le lance, il m'affiche une grille et rien ne se passe si j'appuie sur une touche.
Merci de me guider.
Cordialement,
Avatar de l’utilisateur
jak64
Messages : 85
Inscription : dim. 03/mai/2020 23:16

Re: Inkey() et KeyboardInkey()

Message par jak64 »

En fait, je voudrais détecter uniquement l'appui sur ces 4 touches :
m
q
Return
Esc
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Inkey() et KeyboardInkey()

Message par Ollivier »

Regarde l'aide sur le canvas. J'ai mis le lien de la page. Le canvas est le plus souple et complet des objets de la GUI. Je me lève dans 4 heures donc je ne peux pas être productif maintenant...
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Inkey() et KeyboardInkey()

Message par cage »

Bonsoir,

Code : Tout sélectionner

#WinApp=10

Enumeration Keys
  #KeyEnter
  #KeyM
  #KeyQ
  #KeyEscape
EndEnumeration

Flags = #PB_Window_TitleBar|#PB_Window_ScreenCentered|#PB_Window_SystemMenu

If OpenWindow(#WinApp, 100, 100, 500, 400, "Windows", Flags)
  CanvasGadget(0, 0, 0, 500, 400, #PB_Canvas_Keyboard)

  
  AddKeyboardShortcut(#WinApp, #PB_Shortcut_M     , #KeyM)
  AddKeyboardShortcut(#WinApp, #PB_Shortcut_Q     , #KeyQ)
  AddKeyboardShortcut(#WinApp, #PB_Shortcut_Return, #KeyEnter)
  AddKeyboardShortcut(#WinApp, #PB_Shortcut_Escape, #KeyEscape)

  Repeat
    Event = WaitWindowEvent(20)
    Select Event
      Case #PB_Event_Menu
        indexMenu = EventMenu()
        Select indexMenu
          Case #KeyM      : Debug "M"
          Case #KeyQ      : Debug "Q"
          Case #KeyEnter  : Debug "Entée"
          Case #KeyEscape : Debug "Escape"
        EndSelect
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
EndIf
Juste pour te faire une idée.
cage
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
jak64
Messages : 85
Inscription : dim. 03/mai/2020 23:16

Re: Inkey() et KeyboardInkey()

Message par jak64 »

Bonjour cage,
Merci beaucoup, c'est exactement ce que je souhaitais et je pense que c'est plus rapide que d'être obligé d'avoir une fenêtre screen avec un test KeyboardInkey() dans la boucle.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Inkey() et KeyboardInkey()

Message par falsam »

l'exemple de Cage fonctionne aussi sans l'utilisation du canvas ^^
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
jak64
Messages : 85
Inscription : dim. 03/mai/2020 23:16

Re: Inkey() et KeyboardInkey()

Message par jak64 »

Bonjour Falsam,
Effectivement, j'ai testé sans le canvas et ça fonctionne aussi.
merci.
Avatar de l’utilisateur
jak64
Messages : 85
Inscription : dim. 03/mai/2020 23:16

Re: Inkey() et KeyboardInkey()

Message par jak64 »

Bonjour,
Petite question subsidiaire.
Comment définir ce qu'est un canvas ? Une zone de dessin ? l'équivalent d'une petite fenêtre ? une surface définie ? etc...
Autant je comprends ce que sont d'autres gadgets (bouton, zones de listes, calendrier, etc), autant j'ai du mal à appréhender "canvas".

La définition de l'aide Ce gadget offre une surface de dessin sans canal alpha et d'évènements pour la souris et le clavier dans le but de créer facilement des affichages personnalisées n'est pas très claire pour moi.

Merci de votre explication.
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Inkey() et KeyboardInkey()

Message par Marc56 »

Bonjour,

Le CanvasGadget est une surface de dessin qui peut-être interactive avec l'utilisateur en cours de programme, contrairement à l'ImageGadget où le contenu est créé uniquement par le programme.
Le Canvas a aussi beaucoup plus de fonctions, comme déterminer l'emplacement d'un clic de souris et le maintient enfoncé des boutons etc, là ou L'imageGadget ne peut déterminer que s'il est cliqué ou reçoit un élément par Drag-and-Drop.

L'exemple de la doc montre bien ce qu'on peut faire avec
https://www.purebasic.com/french/docume ... et.pb.html

:wink:
Avatar de l’utilisateur
jak64
Messages : 85
Inscription : dim. 03/mai/2020 23:16

Re: Inkey() et KeyboardInkey()

Message par jak64 »

Merci Marc,
Je pense avoir compris, par exemple, je peux dessiner dans cette zone avec ma souris même lorsque le programme s'exécute. C'est le mot lui-même (canvas) qui me troublait. C'est une "zone de dessin interactive", cette définition est plus claire pour moi.
Avatar de l’utilisateur
jak64
Messages : 85
Inscription : dim. 03/mai/2020 23:16

Re: Inkey() et KeyboardInkey()

Message par jak64 »

Bonjour,
Par contre, on ne peut pas utiliser de Sprites dans un canvas, c'est bien ça ?
Merci
Répondre