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

Langage Delphi Discussion :

[D2010] Comment envoyer une combinaison de touche à un composant ?


Sujet :

Langage Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 678
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 678
    Points : 7 093
    Points
    7 093
    Par défaut [D2010] Comment envoyer une combinaison de touche à un composant ?
    Comment envoyer une combinaison de touche à un composant ?

    Par exemple, pour envoyer la touche [F2]:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PostMessage(RichEdit.Handle, WM_KEYDOWN, VK_F2, 0);
    Mais pour envoyer [Ctrl + Shift + I] ?


  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par Lung Voir le message
    Comment envoyer une combinaison de touche à un composant ?

    Par exemple, pour envoyer la touche [F2]:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PostMessage(RichEdit.Handle, WM_KEYDOWN, VK_F2, 0);
    Mais pour envoyer [Ctrl + Shift + I] ?

    il faut envoyer les touches VK_LCONTROL, VK_LSHIFT puis Ord('I') en VM_KEYDOWN puis WM_KEYUP

    ou passer par Keybd_Event() pour faire la même chose

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 678
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 678
    Points : 7 093
    Points
    7 093
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    il faut envoyer les touches VK_LCONTROL, VK_LSHIFT puis Ord('I') en VM_KEYDOWN puis WM_KEYUP

    ou passer par Keybd_Event() pour faire la même chose
    J'ai essayé, mais ça ne fonctionne pas (le RichEdit ne reçoit rien, ou alors juste le [Ctrl] dans le meilleur des cas : j'ai un point d'arrêt dans son évènement OnKeyDown).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       SendMessage(RichEdit.Handle, WM_KEYDOWN, VK_LCONTROL, 0);
       SendMessage(RichEdit.Handle, WM_KEYDOWN, VK_LSHIFT, 0);
       SendMessage(RichEdit.Handle, WM_KEYDOWN, VK_U, 0);
       SendMessage(RichEdit.Handle, WM_KEYUP, VK_U, 0);
       SendMessage(RichEdit.Handle, WM_KEYUP, VK_LSHIFT, 0);
       SendMessage(RichEdit.Handle, WM_KEYUP, VK_LCONTROL, 0);
    Pareil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       Keybd_Event(VK_LCONTROL, 0, 0, 0);
       Keybd_Event(VK_LSHIFT, 0, 0, 0);
       Keybd_Event(VK_U, 0, 0, 0);
       Keybd_Event(VK_U, 0, KEYEVENTF_KEYUP, 0);
       Keybd_Event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0);
       Keybd_Event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);
    J'ai même testé le code de LadyWasky :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       SimulateKeyDown(VK_LCONTROL);
       SimulateKeyDown(VK_LSHIFT);
       Sendkeys('U');
       SimulateKeyUp(VK_LSHIFT);
       SimulateKeyUp(VK_LCONTROL);
    Je ne pensais pas que ce serait si compliqué.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 812
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Citation Envoyé par Lung Voir le message
    Pareil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       Keybd_Event(VK_LCONTROL, 0, 0, 0);
       Keybd_Event(VK_LSHIFT, 0, 0, 0);
       Keybd_Event(VK_U, 0, 0, 0);
       Keybd_Event(VK_U, 0, KEYEVENTF_KEYUP, 0);
       Keybd_Event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0);
       Keybd_Event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);
    La question est de savoir depuis où et comment tu génères ces commandes : Même application ? Même fiche ? Par TButton ? par TSpeedButton ?
    Ne pas oublier que c'est le contrôle détenant la focalisation qui sera affecté. Keybd_Event ne fait que remplir le buffer de clavier sans se soucier de la destination.

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 678
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 678
    Points : 7 093
    Points
    7 093
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    La question est de savoir depuis où et comment tu génères ces commandes : Même application ? Même fiche ? Par TButton ? par TSpeedButton ?
    Même application, même onglet de PageControl, par un élément d'un menu contextuel.

    Citation Envoyé par Andnotor Voir le message
    Ne pas oublier que c'est le contrôle détenant la focalisation qui sera affecté. Keybd_Event ne fait que remplir le buffer de clavier sans se soucier de la destination.
    J'ai essayé de faire un RichEdit.SetFocus, mais ça ne change rien.

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    euh...c'est supposé faire quoi Ctrl+Shift+U ?!

    car Ctrl+Shift+I ça fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      RichEdit1.SetFocus;
      Keybd_Event(VK_LCONTROL, 0, 0, 0);
      Keybd_Event(VK_LSHIFT, 0, 0, 0);
      Keybd_Event(Ord('I'), 0, 0, 0);
      Keybd_Event(Ord('I'), 0, KEYEVENTF_KEYUP, 0);
      Keybd_Event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0);
      Keybd_Event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);
    end;

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 933
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 933
    Points : 15 384
    Points
    15 384
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    euh...c'est supposé faire quoi Ctrl+Shift+U ?!
    Ça souligne la sélection, enfin dans Wordpad tout au moins.

  8. #8
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 678
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 678
    Points : 7 093
    Points
    7 093
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    euh...c'est supposé faire quoi Ctrl+Shift+U ?!
    Je cherche à reproduire l'indentation / dé-indentation (comme dans Delphi, PsPad, ...) dans un RichEdit (et ça fonctionne).

    Mais par contre, j'avais un problème avec l'appel depuis un élément de menu.
    Je crois que j'ai trouvé le coupable. Ca serait encore le TActionList qui capture la combinaison de touche.

  9. #9
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 678
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 678
    Points : 7 093
    Points
    7 093
    Par défaut
    C'était bien ça. J'ai été obligé de retirer le raccourci du TActionManager.

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

Discussions similaires

  1. comment simuler l'appui d'une combinaison de touches
    Par camatchou dans le forum Débuter
    Réponses: 12
    Dernier message: 04/04/2014, 13h26
  2. Réponses: 3
    Dernier message: 14/09/2009, 09h31
  3. Réponses: 20
    Dernier message: 27/11/2007, 14h40
  4. [VCL] Comment détecter une combinaison de touches ?
    Par micatmidog dans le forum Composants VCL
    Réponses: 3
    Dernier message: 23/01/2005, 14h19
  5. Comment envoyer une commande à une console ?
    Par seb_asm dans le forum Assembleur
    Réponses: 3
    Dernier message: 27/03/2004, 14h09

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