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 :

Simuler l'écriture au clavier


Sujet :

Langage Delphi

  1. #1
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut Simuler l'écriture au clavier
    Bonjour à tous,

    J'aimerai simuler l'écriture au clavier. Par exemple si l'utilisateur clique sur un bouton, c'est comme s'il tapait au clavier un mot prédétermine (par exemple 'coucou').

    J'ai trouvé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Keybd_Event(Ord('A'), 0, KEYEVENTF_EXTENDEDKEY, 0);
    mais c'est juste pour simuler l'écriture d'une lettre donnée.

    Existe-t-il un fonction qui permet d'écrire directement tout un mot ou phrase ?


    Merci d'avance et bonne soirée.
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 531
    Points : 25 067
    Points
    25 067
    Par défaut
    Appelé dans boucle for en parcourant la chaine de 1 à Length la fonction Keybd_Event ?
    Normalement, tu dois pouvoir l'écrire 8 lignes !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Je ne crois pas qu'il y ait de fonction prédéfinie pour cela. Utilise ta fonction plusieurs fois de suite. Méfie toi par contre car lors du clic sur le bouton, tu vas donner le focus au bouton, et donc l'evenement du clavier risque de ne pas marcher ...

    Enfin, bonne chance

    Mick605

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 744
    Points : 13 303
    Points
    13 303
    Par défaut
    Il y a Keyb_event et SendInput.

    Mais dans les deux cas, ce n'est pas aussi simple que ça puisque les caractères accentués devront d'abord être scindés en deux touches .
    (Et je ne parle pas du reste de la table ANSI)

    edit: Je parle bien sûr des caractères accentués ne figurant pas sur le clavier de la langue d'entrée (qui ne sont pas associés à un scancode), tel que "ê", "î" ou de caractères provenant d'autres langues.

  5. #5
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Appelé dans boucle for en parcourant la chaine de 1 à Length la fonction Keybd_Event ?
    Normalement, tu dois pouvoir l'écrire 8 lignes !
    C'est ce que j'ai fait. En effet pas compliqué, mais je voulais juste savoir si quelque chose d'autre existait avant de réinventer la roue .

    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
    procedure TMyHotKey.Simule;
    var
      I: Integer;
      Inp: TInput;
    begin
     for I := 1 to Length(SampCommand) do
      begin
        // press
        Inp.Itype := INPUT_KEYBOARD;
        Inp.ki.wVk := Ord(UpCase(SampCommand[i]));
        Inp.ki.dwFlags := 0;
        SendInput(1, Inp, SizeOf(Inp));
        // release
        Inp.Itype := INPUT_KEYBOARD;
        Inp.ki.wVk := Ord(UpCase(SampCommand[i]));
        Inp.ki.dwFlags := KEYEVENTF_KEYUP;
        SendInput(1, Inp, SizeOf(Inp));
     
        Sleep(5);
      end;
    end;
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

  6. #6
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut
    Arg, ca marche très bien, mais j'ai un petit problème.


    Je déclenche la simulation d'écriture au clavier quand, par exemple, l'utilisateur tape sur la touche "&". Malheureusement, si dans le message simulé en output contient "&", il cycle.

    Comment je pourrais faire pour éviter ce cycle ?

    Merci d'avance
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 744
    Points : 13 303
    Points
    13 303
    Par défaut
    Ca dépend comment tu détectes l'appui sur "&". Par l'événement OnKeyPress, impossible ! Il faut passer par un hook.

    J'attire quant même ton attention sur 2-3 points en plus de mon commentaire précédent (que tu sembles avoir ignoré ):
    • Ton texte sera envoyé correctement seulement sur un clavier AZERTY.
    • Tu ne tiens pas compte du CapsLock et des touches de fonctions.
    • L'intérêt de SendInput est d'envoyer les commandes en une fois en travaillant avec un array of TInput.
    • Le Sleep est inutile.

  8. #8
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut
    Salut, merci pour ta réponse .

    Je vais essayer autrement avec le sendInput.

    En plus, avec mon système actuel, j'ai des problèmes pour simuler des caractères spéciaux du genre ",'µù% etc. Idéalement, quand l'utilisateur tape & (par exemple) un texte qu'il a défini préalablement doit être tapé.

    ++
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

  9. #9
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut
    Youpla,

    Ca aidera ceux qui cherche à faire la même chose que moi :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    procedure TMyHotKey.SimuleKey(const aChar: Char);
    begin
      Case aChar Of
        {Touches majuscules}
        'A'..'Z','0'..'9','?','.','/','§','£','%','µ','°','+':
        Begin
          ToogleKey(VK_SHIFT);
          DoKeybdEvent(VkKeyScan(aChar));
          ToogleKey(VK_SHIFT, False);
        End;
        {Touches Ctrl+Alt}
        '~','#','{','[','|','`','\','^','@',']','}':
        Begin
          SimuleCtrlAlt;
          DoKeybdEvent(VkKeyScan(aChar));
          SimuleCtrlAlt(False);
        End;
        Else
        {Touches minuscules}
          DoKeybdEvent(VkKeyScan(aChar));
      End;
    end;
     
    procedure TMyHotKey.SimuleCtrlAlt(const Down: Boolean = True);
    begin
      ToogleKey(VK_MENU, Down);
      ToogleKey(VK_CONTROL, Down); 
    end;
     
    procedure TMyHotKey.ToogleKey(const aKey: Byte; const Down: Boolean = True);
    var KeyDown : Byte;
    begin
      if not Down then
        KeyDown := 2
      else
        KeyDown := 0;
      keybd_event(aKey, 0, KeyDown, 0);
    end;
     
    // pour l'utiliser :
      for I := 1 to Length(SampCommand) do
        SimuleKey(SampCommand[I]);

    Merci beaucoup pour votre aide .
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 744
    Points : 13 303
    Points
    13 303
    Par défaut
    Mais ça reste de l'AZERTY.
    Enfin si c'est suffisant pour toi

  11. #11
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Sinon, dans le genre "bourrin", tu écris ton texte dans le presse papier, et tu simules l'appui sur Ctrl+V

  12. #12
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Mais ça reste de l'AZERTY.
    Enfin si c'est suffisant pour toi
    Ui c'est normalement suffisant.

    Dans le cas ou je dois passer en internationnal, tu as une solution, ou une piste ?

    Merci de vos réponses
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 531
    Points : 25 067
    Points
    25 067
    Par défaut
    Tu veux écrire dans un control d'une autre appli ?
    utilise WM_SETTEXT à la place !

    Si c'est pas dans une autre appli que la tienne, euh, pourquoi ferait-tu cela ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  14. #14
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Tu veux écrire dans un control d'une autre appli ?
    utilise WM_SETTEXT à la place !

    Si c'est pas dans une autre appli que la tienne, euh, pourquoi ferait-tu cela ?
    Oui en effet, ca a peu de sens dans ce cas ci
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/01/2009, 00h50
  2. Simuler l'écriture au clavier
    Par saad.hessane dans le forum C
    Réponses: 9
    Dernier message: 05/08/2008, 16h22
  3. Simuler plusieur touches du clavier en meme temps !
    Par Chyokyka dans le forum Débuter
    Réponses: 3
    Dernier message: 10/04/2008, 17h10
  4. Simuler des actions au clavier
    Par dosbastos dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 03/05/2005, 15h58
  5. [Turbo Pascal] Simulation de touche du clavier
    Par trapiste dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 04/09/2004, 16h35

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