La surprenante unité Sndkey32

Résolu
fredelm - 15 janv. 2015 à 11:35
fredelem Messages postés 136 Date d'inscription dimanche 29 octobre 2006 Statut Membre Dernière intervention 1 décembre 2022 - 19 janv. 2015 à 07:20
Bonjour,
.
Je viens de découvrir l'unité Sndkey32.Pas. Elle était (et je ne le savais pas) sur mon appareil, dans le répertoire C:\Delphi7\Info\Extras.
Elle était aussi (et je m'en doutais encore moins) sur le DVD qui m'a servi à installer Delphi, dans le répertoire \Info\Extras.
Elle peut aussi être téléchargée à l'adresse suivante:
http://www.delphidabbler.com/tips/181
.
Elle permet, comme on s'en doute, de simuler l'appui sur des touches (fonction Sendkeys). Elle permet aussi de choisir parmi toutes les applications en cours, celle qui recevra les caractères envoyés (Fonction AppActivate).
Elle est un peu agaçante car elle ne sait envoyer que des pchar. Si on veut envoyer un chr(13), il faut écrire:
Sendkeys(PChar(''+#13), true);
.
Quelquefois, elle marche très bien mais quelquefois, elle crée des problèmes. Par exemple, j'ai un programme très simple qui se limite à ceci:
.
Unit Unit1;

Interface

Uses
      Dialogs, Clipbrd, SndKey32;

Implementation

begin
   Appactivate('Delphi7');
   Sendkeys(PChar(''+#1),false);
   Sendkeys(PChar(''+#3),false);
   Showmessage(Clipboard.AsText);
end
.

.
L'envoi d'un caractère #1 (Ctrl-A) devrait sélectionner le texte de l'éditeur en cours. Ensuite l'envoi d'un chr(3) [Ctrl-C) devrait envoyer ce texte dans le presse-papiers. Et la dernière ligne devrait montrer que ça a bien marché. Rien à faire. Et pourtant dans un autre programme, ça marche. Enfin, ça marche à condition d'ajouter des "Showmessage" généreusement.
.
Si vous avez la moindre idée, merci de m'en faire part.
.
Même si vous ne voyez pas de solutions à ce problème, je vous conseille d'essayer cette unité, elle peut être utile. Et si vous réussissez à l'améliorer (par exemple en isolant la fonction "Sendkey" pour pouvoir écrire : Sendkey(#13), ce sera sympa de m'en faire profiter.
.
. . . . . . . . . . . . . .Fred

1 réponse

fredelem Messages postés 136 Date d'inscription dimanche 29 octobre 2006 Statut Membre Dernière intervention 1 décembre 2022 2
Modifié par fredelem le 16/01/2015 à 04:19
. Le programme qui figurait dans mon message précédent ne pouvait pas marcher à cause d'une étourderie. Il fallait écrire 'Delphi 7' au lieu de 'Delphi7'. Si on fait cette correction, ça marche très bien.
.
. On pouvait aussi écrire:
AppActivate(MonDelphi);
à condition d'ajouter la fonction:

FUNCTION MonDelphi:String;
VAR Cv: Byte;
Begin
   Cv:=StrtoInt(Floattostr(CompilerVersion)); // conversion d'un extended en byte!
   Case Cv Of
      14 :MonDelphi:='Delphi 6';
      15 :MonDelphi:='Delphi 7' ;
      16 :MonDelphi:='Delphi 8. NET ' ;
      17 :MonDelphi:='Delphi 2005' ;
      18 :MonDelphi:='Delphi 2006' ;
      19 :MonDelphi:='Delphi 2007 .NET' ;
      20 :MonDelphi:='Delphi 2009' ;
      21 :MonDelphi:='Delphi 2010' ;
      22 :MonDelphi:='Delphi XE 22' ;
      23 :MonDelphi:='Delphi XE2' ;
      24 :MonDelphi:='Delphi XE3' ;
      25 :MonDelphi:='Delphi XE4' ;
      26 :MonDelphi:='Delphi XE5' ;
      27 :MonDelphi:='Delphi XE6';
   End;
End;

.
 
Désolé pour cette erreur.
. . . . . . . . . . . .Fred
0
fredelem Messages postés 136 Date d'inscription dimanche 29 octobre 2006 Statut Membre Dernière intervention 1 décembre 2022 2
19 janv. 2015 à 07:20
Encore un petit mot: J'ai trouvé l'unité Sndkey32 surprenante parce qu'elle figure sur le DVD d'installation de Delphi mais qu'elle n'est pas recopiée sur le disque dur lors de l'installation ! Elle est pourtant bien utile.
.
Mais je pense qu'elle pourrait être un peu améliorée. Extraire la procédure Sendkey me paraît indispensable. J'y suis parvenu mais ça n'a pas été si facile.
.
Cette unité m'avait aussi paru surprenante parce que, quelquefois, les choses marchaient mal. Par exemple si on écrit:
- Clipboard.Astext:='AAAAAAA';
- une ligne pour envoyer un Ctrl-v
- Clipboard.Astext:='BBBBBBB';
on a la surprise de voir la ligne 3 exécutée avant la ligne 2 et c'est BBBBBB qui apparait en réponse au Ctrl-V. Le compilateur a sans doute pour consigne de traiter en dernier les lignes qui envoient des touches. C'est fort ennuyeux.
.
J'ai fini par trouver la parade:
- Application.ProcessMessages après la ligne 2 ne fait rien du tout.
- Un Showmessage réussit à éviter le problème mais ajouter un showmessage inutile a aussi des inconvénients.
- Un Sleep(100) et même dans certains cas un Sleep(1) juste après une ligne ayant pour but d'envoyer un caractère parait être la solution idéale.
0
Rejoignez-nous