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

Composants VCL Delphi Discussion :

meme raccourci clavier pour action a <-> action b ?


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Par défaut meme raccourci clavier pour action a <-> action b ?
    Bonjour ?

    Dans mon projet j'aurai besoin de faire un racourci clavier (imaginons, ctrl+F1)
    qui éffecturai dans un premier temps une action a, et qui si je réappuye éffecturai une action b (activer a = activer un truc, et fonction b = désactiver un truc)
    La procedure a et b sont séparée.

    Alors je vous éxplique le fond de mon probleme :

    Il faudrai éxactement le meme type de fonctionnement que onkeydown et onkeyup afin qu'il capte bien les préssions sur les touches concernées et que si je reste appuyé sa ne fasse pas une boucle.

    Pour l'instant j'utilise l'API GetASyncKeyState utilisé avec un bool comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      if (GetAsyncKeyState(VK_LCONTROL) <> 0) and (GetAsyncKeyState(VK_F1) <> 0) and (bool = false) then
      begin
          actiona;
          invis := True;
          sleep(320);
      end;
      if (GetAsyncKeyState(VK_LCONTROL) <> 0) and (GetAsyncKeyState(VK_F1) <> 0) and (bool = true) then
      begin
          actionb;
          invis := False;
          sleep(320);
      end;
    Et bien évidement, sa capte trés mal l'état des touches à cause des sleeps.
    (Sleep que j'ai du mettre car sinon sa aurai créé une boucle)

    en clair :

    Il faut que la préssion de mon racourci éffectue l'actiona , que je reste appuyé ou que j'appuye une seule fraction de seconde...
    Que si l'action a a été déja éfféctuée, alors la préssion sur cette meme touche éffectura l'actionb.

    Le souci avec les évenement onkeydown et onkeyup(qui me serai bien pratique) est que je ne sais pas comment faire pour les utiliser lorsque je fais ces racourci quand ma form n'a pas le focus.

    ps: pitié, ne me dite pas qu'il faut utiliser des hooks systemes, je n'arrive pas à comprendre comment sa marche .

    Merci d'avance pour le coup de main !

  2. #2
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Citation Envoyé par devoluti0n
    Le souci avec les évenement onkeydown et onkeyup(qui me serai bien pratique) est que je ne sais pas comment faire pour les utiliser lorsque je fais ces racourci quand ma form n'a pas le focus.
    Ben tu te réponds toi-même :
    Citation Envoyé par devoluti0n
    ps: pitié, ne me dite pas qu'il faut utiliser des hooks systemes, je n'arrive pas à comprendre comment sa marche .
    C'est le seul moyen d'intercepter des appuis claviers lorsque ta fiche n'a pas le focus. Ils sont faits pour ça.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    Citation Envoyé par sjrd
    C'est le seul moyen d'intercepter des appuis claviers lorsque ta fiche n'a pas le focus.
    On peut toujours s'en sortir GetAsyncKeyState() et un timer...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    Var
      CTRL_F1: boolean = FALSE;
     
    //== Timer au 100 ms pour la lecture des touches de façon asynchrone...==
    Procedure TForm1.Timer1Timer(Sender: TObject);
    Begin
      //== Verifie si la touche CTRL+F1 est appuyé ==
      If (GetAsyncKeyState(VK_LCONTROL) <> 0) And (GetAsyncKeyState(VK_F1) <> 0) Then
      Begin
        //== CTRL+F1 est appuyé! ==
        If CTRL_F1 = FALSE Then
        Begin
          //== Execute quelque chose 1 seule fois..==
          //== ici, c'est l'équivalent d'un OnKeyDown ==
          RichEdit1.Lines.Add('CTRL+F1 Appuyé');
          CTRL_F1 := TRUE;
        End;
      End
      Else
      Begin
        //== CTRL+F1 n'est pas appuyé! ==
        If CTRL_F1 = TRUE Then
        Begin
          //== ici c'est l'équivalent d'un OnKeyUp ==
          RichEdit1.Lines.Add('CTRL+F1 Relâché');
          CTRL_F1 := FALSE;
        End;
      End;
    End;
    Il est certain tout de même que les hooks systèmes serait moins couteux en
    temps CPU et sont mieux adaptés au comportement que tu recherche.
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    Peut-être j'ai mal compris aussi le comportement que tu recherche...
    Alors voilà une Version 2 basé sur le même principe.
    Ici, si je maintient CTRL+F1, le timer étant fixé à 300ms, j'obtiens en
    alternance un action A et B...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    Var
      TOGGLE_CTRL_F1: boolean = FALSE;
     
    //== Timer au XXX ms pour la lecture des touches de façon asynchrone...==
    //== La vitesse de répetion est controlé par la vitesse du timer ==
    //== quelque chose comme 250-300ms c'est pas mal.... ===
    Procedure TForm1.Timer1Timer(Sender: TObject);
    Begin
      //== Verifie si la touche CTRL+F1 est appuyé ==
      If (GetAsyncKeyState(VK_LCONTROL) <> 0) And (GetAsyncKeyState(VK_F1) <> 0) Then
      Begin
        //== CTRL+F1 est appuyé! ==
        If TOGGLE_CTRL_F1 = FALSE Then
        Begin
          RichEdit1.Lines.Add('CTRL+F1 Appuyé Action A');
        End
        Else
        Begin
          RichEdit1.Lines.Add('CTRL+F1 Appuyé Action B');
        End;
        //== Toggle Action on CTRL+F1 ==
        TOGGLE_CTRL_F1:=Not TOGGLE_CTRL_F1;
      End
      Else
      Begin
        //== Si les touche CTRL+F1 sont relâché, ce remet prêt à faire Action A ==
        TOGGLE_CTRL_F1:=FALSE;
      End;
    End;
    Voilà, je crois que c'est plutôt ça ce que tu cherche à faire?
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Par défaut
    En fait il ne faut justement pas que sa créé une boucle...

    Bon bah si il faut un hook ... me voilà perdu !

    J'ai déjâ éssayé de faire sa à l'époque, j'en avais été incapable .

    Ps: oh ! je viens d'éssayer la technique n1 d'Eric Boisvert et elle est trés proche de ce dont je souaitais

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    alors si tu veux pas de boucle, mon premier post est pour toi non?
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

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

Discussions similaires

  1. utilisation des raccourcis claviers pour debugger.
    Par Mobistar dans le forum Eclipse Java
    Réponses: 8
    Dernier message: 30/05/2007, 15h39
  2. raccourcis clavier pour JMenuItem
    Par Jmakolish dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 19/06/2006, 13h44
  3. Raccourci clavier pour liste déroulante
    Par enguerran dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 17/05/2006, 04h53
  4. [eclipse 3.0.1]Raccourci clavier pour changer de fichier
    Par partyboy dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 04/11/2004, 15h06
  5. [] Raccourci clavier pour bouton d'une barre d'outil
    Par Sébastien dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 24/03/2003, 17h02

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