IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

récupérer combinaison touches


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut récupérer combinaison touches
    Salut,
    J'ai une application avec dedans un WebBrowser et des Memos que je crée dynamiquement. J'ai défini la méthode FormKeyDown de mon application de façon à récupérer les combinaisons de touches 'Ctrl + PgUp', 'Ctrl + PgDn' et d'autres pour pouvoir y faire des traitements queje veux. Tout à l'air de fonctionner mais dès que je le focus de mon application se retrouve sur le WebBrowser, mes combinaisons de touches ne sont plus détectées.

    Par exemple si l'on fait 'Ctrl + N', ça doit rajouter un nouvelonglet contenant un TMemo. Si le focus estdéjà sur un TMemo, il se crée parfaitement. Dès que mon focus est sur mon WebBrowser, c'est une nouvelle fenêtre de Internet Explorer qui s'ouvre.

    J'ai bien mis KeyPreview à true dans ma Form principale et voici mon code où je détecte les touches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TfmMain.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if ((GetAsyncKeyState(VK_CONTROL) <> 0)) and (key = VK_PRIOR) then
        LeftWebTabSheet;
      if ((GetAsyncKeyState(VK_CONTROL) <> 0)) and (key = VK_NEXT) then
        RigthWebTabSheet;
      if ((GetAsyncKeyState(VK_MENU) <> 0)) and (key = VK_PRIOR) then
        LeftNoteTabSheet;
      if ((GetAsyncKeyState(VK_MENU) <> 0)) and (key = VK_NEXT) then
        RigthNoteTabSheet;
      if ((GetAsyncKeyState(VK_CONTROL) <> 0)) and (key = VK_N) then
        AddTabSheet;
    end;
    Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!

    Il faut utiliser un tableau de boolean pour stocker l'état de chaque touche pour pouvoir détecter les combinaisons. Dans cette démo, j'utilise les touches de direction pour déplacer la souris. Par exemple, on peut déplacer la souris en diagonale en appuyant 2 touches simultannément. Tu trouveras la liste des touches dans l'archive. Ce programme utilise un Timer pour la détection afin d'être indépendant de l'application qui possède le focus. Tu trouveras aussi des sujets discutant de cette fonction en faisant une petite recherche dans le forum. Exemple :
    http://www.developpez.net/forums/showthread.php?t=18434
    http://www.developpez.net/forums/showthread.php?t=61880

  3. #3
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    Merci pour ta réponse Sub0. J'avais déjà vu les topics sur le sujet mais je dois t'avouer que cette approche de tableau de booléens me faisait peur. En me plongeant plus en avant dans ton code je me rends compte que c'est peut-être pas si compliqué que ça.

    Donc si je comprends bien, si j'utilise un timer je suis en mesure de récupérer à mon compte toutes les combinaisons de touches entrées par l'utilisateur. Mais maintenant si je ne veux pas récupérer "toutes" les combinaisons mais seulement certaines pour garder ainsi certains comportements utiles (je pense aux fameux copier-coller Ctrl+C/Ctrl+V), je suis coincé non ? (il n'y a que trois semaines que je fais du Delphi donc des fois je doute de mes capacités )

  4. #4
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    J'ai essayé ça mais ça n'a pas l'air de marcher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TfmMain.Timer1Timer(Sender: TObject);
    var
      x: Byte;
    begin
      { Capture de l'état des boutons et position de la souris et du clavier }
      For x := Low(Etat) To High(Etat) Do
        If ((GetAsyncKeyState(x) And 32768) <> 0) Then Etat[x] := True
        Else If ((GetAsyncKeyState(x) And 32768) = 0) Then Etat[x] := False;
     
      { Traitement à effectuer en fonction de la combinaison de touche détectée }
      if (Etat[VK_CONTROL] and Etat[110]) then AddNoteTabSheet; // je veux détecter 'Ctrl+N'
    end;

  5. #5
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Qu'est-ce qui ne marche pas, le code où ta façon de l'utiliser ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (Etat[VK_CONTROL] and Etat[Ord('N')]) then Begin
      Timer1.Enabled := False;
      ShowMessage('Ayé! Ctrl+N');
      Timer1.Enabled := True;
    End;
    Il vaut mieux arrêter le Timer le temps de l'opération (surtout avec ShowMessage)...
    à+

  6. #6
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    Ca y'est j'ai réussi à faire un traitement au moment où je fais la combinaison. Par contre, le webbrowser semble toujours avoir récupéré le raccourci. Par exemple toujours pour 'Ctrl+N' j'ai bien un message qui s'affiche et juste après j'ai internet explorer qui ouvre un nouvel onglet. Existe-t-il un moyen pour prendre définitivement le signal à mon compte ?

    Et puis, merci pour le coup de main Sub0

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JTable] Récupérer la touche [ENTER] dans mon Editor
    Par nicorama dans le forum Composants
    Réponses: 3
    Dernier message: 27/04/2007, 08h10
  2. récupérer la touche tab dans un Tedit
    Par sher56 dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/05/2006, 12h26
  3. Récupérer la touche du clavier pressée
    Par deubal dans le forum Débuter
    Réponses: 2
    Dernier message: 25/10/2005, 16h58
  4. [KeyEvent] Combinaison touche clavier et listener
    Par patricetoan dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 14/06/2005, 09h30
  5. [FLASH MX] Récupérer la touche tapée
    Par VincentB dans le forum Flash
    Réponses: 2
    Dernier message: 28/03/2005, 21h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo